该表达式int.Minvalue / -1根据C#规范导致实现定义的行为:
7.8.2分部运营商
如果左操作数是最小的可表示的int或long值而右操作数是-1,则发生溢出.在已检查的上下文中,这会导致抛出System.ArithmeticException(或其子类).在未经检查的上下文中,它是实现定义的,是否抛出System.ArithmeticException(或其子类)或溢出未报告,结果值是左操作数的值.
测试程序:
var x = int.MinValue;
var y = -1;
Console.WriteLine(unchecked(x / y));
Run Code Online (Sandbox Code Playgroud)
这会引发OverflowException.NET 4.5 32位,但它没有.
为什么规范会保留结果实现定义?这是反对这样做的情况:
idiv在这种情况下,x86 指令总是会导致异常.同样有趣的是,如果x / y是一个编译时常量我们确实得到unchecked(int.MinValue / -1) == int.MinValue:
Console.WriteLine(unchecked(int.MinValue / -1)); //-2147483648
Run Code Online (Sandbox Code Playgroud)
这意味着,x / y可以有根据使用的语法形式在不同的行为(而不是只依赖于的值x和y).这是规范允许的,但它似乎是一个不明智的选择.为什么C#这样设计?
一个类似的问题指出,在说明书这一确切行为被规定,但它并没有(足够的)回答为什么语言是这样设计的.不讨论替代选择.