当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 12:12:19 C#

为什么要定义C#规范(int.MinValue/-1)实现?根据C#规范,表达式int.Minvalue/-1导致实现定义的行为:7.8.2除法运算符如果左操作数是最小的可表示int或long值并且右操作数是-1,则会发生溢出。在已检查的上下文中,这会导致抛出System.ArithmeticException(或其子类)。在实现定义的未检查上下文中,无论抛出System.ArithmeticException(或其子类)还是未报告溢出,结果值都是左操作数的值。测试程序:varx=int.MinValue;变量y=-1;Console.WriteLine(未选中(x/y));这会在.NET4.532位上引发OverflowException,但这不是必须的。为什么规范保留结果实现定义?这是反对这样做的情况:x86idiv指令在这种情况下总是会导致异常。在其他平台上,可能需要运行时检查来模拟这一点。但与该部门的成本相比,该检查的成本会很低。整数除法非常昂贵(15-30个周期)。这会带来兼容性风险(“一次写入,无处可写”)。开发商惊喜。同样有趣的是,如果x/y是编译时常量,我们会得到unchecked(int.MinValue/-1)==int.MinValue:Console.WriteLine(unchecked(int.MinValue/-1));//-2147483648这意味着x/y可以根据所使用的句法形式表现不同(并且不仅取决于x和y的值)。规范允许这样做,但这似乎是一个不明智的选择。C#为什么要这样设计?Asimilarquestionpointspointswhichexactbehaviorismandatedinthespecification,但它没有(充分)回答为什么语言是这样设计的。不讨论备选方案。这是C#语言规范Ecma-335(公共语言基础设施规范)的较大兄弟的副作用。第III节,第3.31章描述了DIV操作码的作用。C#规范通常不得不遵循规范,这是不可避免的。它指定它可以抛出但不需要它。否则,对真实处理器的作用进行现实评估。每个人使用的东西都很奇怪。Intel处理器对溢出行为太古怪了,它们是在1970年代设计的,假设每个人都会使用INTO指令。没有人,另一天的故事。它不会忽略IDIV上的溢出然后抛出#DE陷阱,不能忽略那一声巨响。在处理器行为不一致的情况下,很难在粗略的运行时规范之上编写语言规范。很少有C#团队可以做到这一点,但转发不精确的语言。他们通过记录OverflowException而不是ArithmeticException超越了规范。很调皮。他们看了看。偷看了这个做法。这不太可能成为问题,抖动决定是否内联。并且非内联版本抛出,期望内联版本做同样的事情。从来没有人失望过。C#的一个主要设计目标据说是“最小惊奇法则”。根据指南,编译器不应试图猜测程序员的意图,而应向程序员发出信号,表明需要额外的指导才能正确指定意图。这在感兴趣的情况下有效,因为在二进制补码算法的限制内,该操作产生了一个非常令人惊讶的结果:Int32.MinValue/-1计算为Int32.MinValue。发生溢出,需要不可用的第33位(0)才能正确表示Int32.MaxValue+1的正确值。正如预期的那样,并在您的引述中指出,在检查的上下文中,抛出异常以提醒程序员未能正确指定意图。在未检查的上下文中,允许实现在已检查的上下文中运行,或者溢出并返回令人惊讶的结果。有一些上下文,比如bit-twiddling,使用signedint很方便,但溢出行为实际上是意料之中和意料之中的。通过检查实现说明,程序员可以确定这种行为是否确实是预期的。以上是C#学习教程:为什么要定义C#规范(int.MinValue/-1)实现?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: