Tag: 未选中

来自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 。 这对我来说仍然像编译器错误。