在 C# 中,内置整数由预定义长度的位值序列表示。int
对于长度为 32 位的基本数据类型。由于 32 位只能表示 4,294,967,296 个不同的可能值(因为那是 2^32),显然您的代码不会随着值的不断增加而永远循环。
由于int
可以同时保存正数和负数,因此必须以某种方式对数字的符号进行编码。这是用第一位完成的。如果第一位为 1,则该数为负数。
以下是十六进制和十进制数列上的 int 值:
Hexadecimal Decimal
----------- -----------
0x80000000 -2147483648
0x80000001 -2147483647
0x80000002 -2147483646
... ...
0xFFFFFFFE -2
0xFFFFFFFF -1
0x00000000 0
0x00000001 1
0x00000002 2
... ...
0x7FFFFFFE 2147483646
0x7FFFFFFF 2147483647
从这个图表中可以看出,代表最小可能值的位是通过将最大可能值加 1 得到的,同时忽略符号位的解释。以这种方式添加有符号数时,称为“整数溢出”。是否允许整数溢出或将其视为错误可以使用 C# 中的checked
andunchecked
语句进行配置。默认是未选中的,这就是为什么没有发生错误,但是你在你的程序中得到了那个疯狂的小数字。
这种表示称为2's Complement。