永远增加,你得到-2147483648?

问题描述 投票:5回答:9

由于一个聪明而复杂的原因,我不想解释(因为它涉及以非常丑陋和hacky的方式制作计时器),我写了一些C#代码,如下所示:

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

我希望程序永远挂起或崩溃或者其他东西,但是,令我惊讶的是,在等待大约20秒左右之后,我得到了这个输出:

-2147483648

编程已经教会了很多东西,但是我仍然无法理解为什么不断增加一个数字导致它最终变成负面...这里发生了什么?

c# loops increment infinite-loop integer-overflow
9个回答
12
投票

在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


8
投票

该值溢出了32位整数存储的正范围,输入到0xFFFFFFFF,即十进制的-2147483648。这意味着您以31位整数溢出。

有人指出,如果你使用unsigned int,你会得到不同的行为,因为第32位没有被用来存储数字的符号。


2
投票

你正在经历的是Integer Overflow

在计算机编程中,当算术运算尝试创建大于可在可用存储空间中表示的数值时,会发生整数溢出。例如,将1加到可以表示的最大值构成整数溢出。在这些情况下最常见的结果是存储结果的最不重要的可表示位(结果称为换行)。


2
投票

int是一个有符号整数。一旦超过最大值,它从最小值开始(大负值)并向0前进。

再试一次uint,看看有什么不同。


2
投票

试试这样:

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

并解释结果


2
投票

其他人一直在说什么。如果你想要的东西可以永远存在(我不会说你为什么需要这种东西),请使用System.Numerics命名空间(.NET 4+)中的BigInteger类。您可以对任意大数进行比较。


0
投票

它与正数和负数如何真正存储在内存中(位级别)有很大关系。

如果您有兴趣,请观看此视频:Programming Paradigms在12:25及之后。非常有趣,您将理解为什么您的代码的行为方式。


0
投票

这是因为当变量“i”达到最大int限制时,下一个值将是负值。


-1
投票

我希望这听起来不像是聪明的建议,因为它的意思很好,并不意味着讽刺。

您要问的是我们要描述整数数据类型的基本行为。

在任何计算机科学课程的第一年都有数据类型被覆盖的原因,这对于理解事情可能出错的方式和地点非常重要(你可能已经看到上述行为如果意外导致意外行为,即你的申请)。

我的建议是掌握第一年计算机科学的阅读材料+ Knuth的开创性作品“计算机编程艺术”,大约500美元,你将拥有成为一名优秀程序员所需的一切,比整个Uni课程便宜得多; )

© www.soinside.com 2019 - 2024. All rights reserved.