我们知道int值的最大值为2 ^ 31 - 1,最小值为-2 ^ 31。如果我们将int设置为最大值:
int x = int.MaxValue;
我们接受x并在未经检查的字段中添加一个
unchecked
{
x++;
}
然后我们得到x = int的最小值。我的问题是为什么会发生这种情况以及它如何在二进制方面发生。
答案 0 :(得分:5)
在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#中的checked和unchecked语句进行配置。
如果你想深入了,你可以check this link。
答案 1 :(得分:-2)
Int的最大值为2 ^ 31 - 1,因为int是Int32
的别名,它在内存中存储4个字节来表示该值。
现在让我们来看int.Max + 1
的概念。在这里,您需要了解用于存储负值的Signed number representations。在二进制数表示中,没有什么像负数,但它们用一个补码和两个补码位表示。
可以说,我的int1有一个1字节的存储空间,即。 8位。因此,您可以存储到int1
的最大值为2^8 -1 = 255
。现在让我们在这个值中添加1 -
11111111
+ 00000000
----------
100000000
您的输出是十进制的100000000 =(512),超出了int1的存储容量,并且表示十进制的-256的负值(因为第一位显示负值)。
这是将int.Max加1,int.Minimum的原因。即
`int.Maximum + 1 = int.Minimum`
答案 2 :(得分:-2)
好的,为了方便起见,我假设C#中有一个4位整数类型。最重要的位用于存储符号,其余三个用于存储幅度。
可以以这样的表示存储的最大数量是+7(基数10中的正数7)。在二进制文件中,这是:
0111
现在让我们添加积极的一个:
0111
+0001
_____
1000
哎呀,哎呀,从大小的结转,翻了一下标志位!您在上面看到的总和实际上是数字-8,可以存储在此表示中的最小可能数字。如果您不熟悉two's complement,这是签名数字通常以二进制形式表示的方式,您可能会认为该数字为负零(在sign and magnitude表示中就是这种情况)。你可以阅读两个补码来更好地理解这一点。