当我执行以下代码时,我有一些意外的行为。
int i = Int32.MinValue;
i--;
if (i == Int32.MaxValue)
{
Console.WriteLine("i == Int32.MaxValue");
}
i++;
if (i == Int32.MinValue)
{
Console.WriteLine("i == Int32.MinValue");
}
为什么Int32.MinValue上的-1不引发异常?
由于下溢,值会换行。
如果要引发溢出/下溢,则需要使用checked
节。
checked关键字用于显式启用整型算术运算和转换的溢出检查。
来自MSDN:
当发生整数溢出时,会发生什么取决于执行上下文,可以检查也可以不检查。在已检查的上下文中,会引发OverflowException。在未检查的上下文中,结果的最高有效位将被丢弃,并继续执行。因此,C#为您提供了处理或忽略溢出的选择。
MSDN 的链接
C#和C一样,除非明确写入/告知,否则实际上不会进行上溢/下溢检查。因此,从100...000
减去1并获得011...111
是没有问题的。
int
是一个2的补码二进制数。