-1 * int.MinValue给出错误

时间:2011-11-24 11:34:20

标签: c# .net int

当我写这段代码时

Console.WriteLine(-1 * int.MinValue);

int a = -1 * -2147483648;

我收到错误

  

在检查模式下,编译时操作溢出。

是否有编译时检查特别是这个值? 还是实时计算所有书面表达?

4 个答案:

答案 0 :(得分:9)

编译器能够在编译时而不是运行时执行(乘法)计算,所以它确实如此。

由于-1 * int.MinValue( - 1 * -2,147,483,648,因此2,147,483,648)大于int.MaxValue(2,147,483,647),因此它会为您提供编译错误。

要证明这不是特殊的陈述,请尝试:

Console.WriteLine(-2 * 1073741826);

你会得到同样的行为。

答案 1 :(得分:3)

Int(或更确切地说Int32)可以保存任何32位整数值。范围从-2147483648到2147483647.

-1 * -2147483648 = 2147483648。这大于最大Int32值。这就是你得到溢出的原因。

如果要进行计算,可以将其中一个值强制转换为Int64。所以这应该有效:

(Int64)(-1)*int.MinValue;

答案 2 :(得分:3)

没有必要进行特殊检查 - 价值自然会溢出。它就像:

Console.WriteLine(int.MaxValue + 1);

明显溢出int - 它与int.MinValue * -1的值相同。

来自C#4规范的第7.19节:

  

除非在未经检查的上下文中显式放置常量表达式,否则在表达式的编译时评估期间,在整数类型算术运算和转换中发生的溢出总是会导致编译时错误。

答案 3 :(得分:0)

有值的运行时检查。 int值从-21474048到+21474047(为什么?2's complement)。所以你得到一个例外。