在 java ,
int x = 0;
(int)(-1.0 / x) -> Integer.MinValue
(int)(1.0 / x) -> Integer.MaxValue
但是在 C# 中,
int x = 0;
(int)(-1.0 / x) -> Int32.MinValue
(int)(1.0 / x) -> Int32.MinValue!!
如果使用“unchecked”语句/运算符,行为将相同,如果使用“checked”,则它是溢出异常。
但可以肯定的是,在未经检查的上下文中,除了 1.0/x(其中 x = 0)之外,会导致 Int32.MaxValue,而不是 Int32.MinValue。
我错过了什么吗?
最佳答案
人们不应该期待任何事情,真的。来自 C# 规范的第 6.2.1 节(强调我的):
将其与 Java 规范 section 5.1.3 进行比较:
所以基本上,这两种语言做出不同的保证,并且实现似乎都满足这些保证。
我想,由于更宽松的规范,.NET JIT 能够使用更有效的转换,结果恰好是 int.MinValue
。