在已检查和未检查的上下文中进行编译

时间:2014-02-12 10:24:00

标签: c#

j的价值是什么?

Int32 i = Int32.MinValue;
Int32 j = -i;

在检查的上下文中编译会抛出异常 在未经检查的情况下,我们获得了值Int32.MinValue

但为什么会这样呢?

2 个答案:

答案 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它将按预期工作。