gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:03:43 26 4
gpt4 key购买 nike

出于一个我真的不想解释的聪明而复杂的原因(因为它涉及以极其丑陋和骇人听闻的方式制作计时器),我写了一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com