在 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

10-06 11:10