出于一个我不想解释的聪明而复杂的原因(因为它涉及到以极其丑陋和怪异的方式制作计时器),我编写了一些如下的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#中的checkedunchecked语句配置是否允许整数溢出或将其视为错误。默认值是未选中,这就是为什么没有错误发生的原因,但是您在程序中得到了那个疯狂的小数字。

representation称为2's Complement

关于c# - 永远增加,您会得到-2147483648?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6194109/

10-12 12:53