当我写这段代码时
Console.WriteLine(-1 * int.MinValue);
或
int a = -1 * -2147483648;
我收到错误
在检查模式下,编译时操作溢出。
是否有编译时检查特别是这个值? 还是实时计算所有书面表达?
答案 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)。所以你得到一个例外。