出于一个我不想解释的聪明而复杂的原因(因为它涉及到以极其丑陋和怪异的方式制作计时器),我编写了一些如下的C#代码:
int i = 0;
while (i >= 0) i++; //Should increment forever
Console.Write(i);
我希望程序能够永远挂起或崩溃,但是,令我惊讶的是,在等待大约20秒左右后,我得到了这样的输出:
-2147483648
好的,编程教会了我很多东西,但是我仍然不明白为什么不断增加一个数字会导致它最终变成负数……这是怎么回事?
最佳答案
在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
和unchecked
语句配置是否允许整数溢出或将其视为错误。默认值是未选中,这就是为什么没有错误发生的原因,但是您在程序中得到了那个疯狂的小数字。该representation称为2's Complement。
关于c# - 永远增加,您会得到-2147483648?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6194109/