gpt4 book ai didi

c# - 为什么编译器评估余数 MinValue % -1 与运行时不同?

转载 作者:IT王子 更新时间:2023-10-29 04:31:05 25 4
gpt4 key购买 nike

我认为这看起来像是 C# 编译器中的错误。

考虑这段代码(在一个方法中):

const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);

它编译时没有错误(或警告)。 似乎是一个错误。运行时,在控制台上打印 0

然后在没有 const 的情况下,代码:

long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);

运行时,它会正确地导致抛出 OverflowException

C# Language Specification 专门提到了这种情况,并说将抛出 System.OverflowException。它似乎不依赖于 checkedunchecked 的上下文(此外,余数运算符的编译时常量操作数的错误与 checked未选中)。

同样的错误发生在 int (System.Int32),而不仅仅是 long (System.Int64) .

相比之下,编译器使用 const 操作数处理 dividend/divisordividend % divisor 好得多。

我的问题:

我说得对吗,这是一个错误?如果是,是否是他们不想修复的众所周知的错误(因为向后兼容,即使将 % -1 与编译时常量 一起使用是相当愚蠢的-1)?还是我们应该报告它,以便他们可以在即将推出的 C# 编译器版本中修复它?

最佳答案

这种极端情况在编译器中得到了非常明确的解决。 Roslyn source 中最相关的注释和代码:

// Although remainder and division always overflow at runtime with arguments int.MinValue/long.MinValue and -1     
// (regardless of checked context) the constant folding behavior is different.
// Remainder never overflows at compile time while division does.
newValue = FoldNeverOverflowBinaryOperators(kind, valueLeft, valueRight);

和:

// MinValue % -1 always overflows at runtime but never at compile time    
case BinaryOperatorKind.IntRemainder:
return (valueRight.Int32Value != -1) ? valueLeft.Int32Value % valueRight.Int32Value : 0;
case BinaryOperatorKind.LongRemainder:
return (valueRight.Int64Value != -1) ? valueLeft.Int64Value % valueRight.Int64Value : 0;

还有旧版 C++ 编译器的行为,一直追溯到版本 1。来自 SSCLI v1.0 分发版,clr/src/csharp/sccomp/fncbind.cpp 源文件:

case EK_MOD:
// if we don't check this, then 0x80000000 % -1 will cause an exception...
if (d2 == -1) {
result = 0;
} else {
result = d1 % d2;
}
break;

因此得出的结论是,这并没有被忽视或遗忘,至少对于从事编译器工作的程序员来说,它可能被认为是 C# 语言规范中不够精确的语言。在 this post 中了解更多关于这个 killer poke 引起的运行时问题的信息.

关于c# - 为什么编译器评估余数 MinValue % -1 与运行时不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com