j
的价值是什么?
Int32 i = Int32.MinValue;
Int32 j = -i;
在检查的上下文中编译会抛出异常
在未经检查的情况下,我们获得了值Int32.MinValue
。
但为什么会这样呢?
答案 0 :(得分:4)
这是最小和最大Int32值:
Dec Bin (first bit is a sign bit)
Int32.MinValue -2147483648 10000000000000000000000000000000
Int32.MaxValue 2147483647 01111111111111111111111111111111
当您尝试使用显式溢出检查获取-(-2147483648)
时,在这种情况下会出现异常,因为2147483648
大于int类型的最大允许值。
那么为什么在允许溢出时获得MinValue?因为当Int32.MinValue被否定时,你有2147483648
具有二进制表示10000000000000000000000000000000
但是带符号整数的第一位是符号位,所以你得到的是Int32.Min值。
所以,这里的问题是将第一位视为数字符号。如果你将否定的Int32.Min值的结果赋值给无符号整数,你会得到2147483648
值,如预期的那样:
Int32 i = Int32.MinValue;
UInt32 j = (UInt32)-i; // it has 32 bits and does not treat first bit as sign
答案 1 :(得分:3)
这是整数溢出的示例。在检查的上下文中,将检测整数溢出并将其转换为异常,因为语言设计者决定这样做。
要解释整数溢出,可以手动进行二进制计算。要计算-X,取二进制X,将所有1改为0,将0改为1,然后加1(数字1,而不是1位)。
Example: 5 = 00000000000000000000000000000101 flip all bits: 11111111111111111111111111111010 add one: 11111111111111111111111111111011 which is -5 Int32.MinValue = 10000000000000000000000000000000 flip all bits: 01111111111111111111111111111111 add one: 10000000000000000000000000000000
如果你采用Int32.MinValue并否定它,它就不会改变。 -Int32.MinValue不能适合int - 如果你这样做 - (Int64)Int32.MinValue它将按预期工作。