来自unchecked()的奇怪结果,可能的编译器错误?
以下代码段评估为零:
int result = unchecked((int)double.MaxValue);
然而,如果你这样做:
double x = double.MaxValue int result = (int)x;
结果是(你会猜到这个吗?) int.MinValue
。 这个事实本身就很奇怪[见下文],但我的印象是, unchecked
是为了迫使编译器发出代码,假装不知道转换肯定会失败和/或发生某些溢出。 换句话说,它应该给出与编译器不知道所涉及的值时相同的结果(假设它是在禁用“检查算术溢出”的情况下编译的)
那么,这里发生了什么? 我对unchecked
错误理解是什么?
根据C#/ .NET标准,其中一个结果是“错误的”吗?
编辑: int.MinValue
很容易解释: cvttsd2si
在溢出但exception被屏蔽时给出0x80000000。 这是JIT编译器使用的指令,可以在反汇编窗口中看到。 但这并没有解决问题的任何部分。
根据ECMA 334(C#2规范), unchecked
关键字应始终截断,因此在这两种情况下结果应为零:
int result1 = unchecked((int)double.MaxValue); double x = double.MaxValue; int result2 = unchecked((int)x);
但事实并非如此,第二个给出了int.MinValue
。 这对我来说仍然像编译器错误。
从MSDN上未经检查的关键字 ,
在未经检查的上下文中,如果表达式生成的值超出目标类型的范围,则结果将被截断。
检查默认上下文,
在已检查的上下文中,如果表达式生成的值超出目标类型的范围,则结果取决于表达式是常量还是非常量。 常量表达式导致编译时错误,而非常量表达式在运行时计算并引发exception。
最后,Double / Float不会换行。
好的,我找到了。 深埋在规范中,有以下内容:
在未经检查的上下文中,转换始终成功,并按如下方式继续。
•该值向零舍入到最接近的整数值。 如果此整数值在目标类型的范围内,则此值是转换的结果。
• 否则,转换结果是目标类型的未指定值。
就是这样了。 结果是未定义的。 一切都好。
上述就是C#学习教程:来自unchecked()的奇怪结果,可能的编译器错误?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1008193.html