c# - 永远增加你得到-2147483648?

标签 c# loops increment infinite-loop integer-overflow

出于一个我真的不想解释的聪明而复杂的原因(因为它涉及以极其丑陋和骇人听闻的方式制作计时器),我写了一些 C# 代码,如下所示:

int i = 0;
while (i >= 0) i++; //Should increment forever
Console.Write(i);

我原以为程序会永远挂起或崩溃之类的,但令我惊讶的是,在等待大约 20 秒左右后,我得到了这个输出:

-2147483648

好吧,编程教会了我很多东西,但我仍然不明白为什么不断递增一个数字会导致它最终变成负数...这是怎么回事?

最佳答案

在 C# 中,内置整数由一系列预定义长度的位值表示。对于长度为 32 位的基本 int 数据类型。由于 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

正如您从这张图表中看到的,代表最小可能值的位是您将最大可能值加一所得到的,同时忽略符号位的解释。当一个有符号数以这种方式相加时,称为“整数溢出”。是否允许整数溢出或将其视为错误可使用 C# 中的 checkedunchecked 语句进行配置。默认是未选中的,这就是为什么没有发生错误,但你的程序中出现了那个疯狂的小数字。

representation叫做2's Complement .

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

相关文章:

c# - 获取包含在 Windows Media Center 库中的目录

javascript - 如何在对象内的某个键处开始循环?

python - 代码优化python循环

c++ - 如何将 C++ 中的字母组合增加到 'z' 之外?

java - GAE 数据存储增量 ID

c# - C# 和 C++ 中的++i 运算符区别

c# - 图像字节数组未正确保存

c# - 禁用 WPF DataGrid 上的行编辑

c# - 使用 linq 迭代字段

windows - 批处理文件中的 For 循环错误地从文件读取输入 - 循环失败