相关疑难解决方法(0)

为什么定义C#规范(int.MinValue/-1)实现?

该表达式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位,但它没有.

为什么规范会保留结果实现定义?这是反对这样做的情况:

  1. idiv在这种情况下,x86 指令总是会导致异常.
  2. 在其他平台上,可能需要运行时检查来模拟此操作.但是与该部门的成本相比,该检查的成本会很低.整数除法非常昂贵(15-30个周期).
  3. 这会打开兼容性风险("写一次无处可写").
  4. 开发者惊喜.

同样有趣的是,如果x / y是一个编译时常量我们确实得到unchecked(int.MinValue / -1) == int.MinValue:

Console.WriteLine(unchecked(int.MinValue / -1)); //-2147483648
Run Code Online (Sandbox Code Playgroud)

这意味着,x / y可以有根据使用的语法形式在不同的行为(而不是只依赖于的值xy).这是规范允许的,但它似乎是一个不明智的选择.为什么C#这样设计?

一个类似的问题指出,在说明书这一确切行为被规定,但它并没有(足够的)回答为什么语言是这样设计的.不讨论替代选择.

c# language-design

24
推荐指数
2
解决办法
454
查看次数

标签 统计

c# ×1

language-design ×1