【问题标题】:Why this specific operation overflow (cf. CS0220) in C#?为什么这个特定的操作在 C# 中溢出(参见 CS0220)?
【发布时间】:2009-04-03 18:00:22
【问题描述】:

我尝试构建一个大的 Int64,其中包含以字节为单位的半字节信息。

以下代码行按预期工作:

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000));

为什么下面这行会导致编译错误CS0220“The operation overflows at compile time in checked mode”而其他的不会?

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000));

结果是:

FFFFFFFFD0000000

代替:

0000D0000000

谁能解释一下?我现在将使用移位运算符进行转换,但仍然很好奇为什么这种方法不起作用!

更新:使用 (Int64)(0x0d

【问题讨论】:

    标签: c# compiler-construction overflow


    【解决方案1】:

    您需要将常量值专门标记为 longs (Int64s) 或可能的 ulongs (UInt64s),否则默认情况下它们将被解释为 int(即 Int32s),显然会导致溢出。在这种情况下,在乘法运算之后进行强制转换对您没有任何好处。

    尚未测试,但此代码应该可以工作:

    Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
    Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
    Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
    

    【讨论】:

    • 你的速度更快!回复出现时正在完成相同的答案。 +1。完全同意你的回答:)
    【解决方案2】:

    整数文字的类型为 Int32(即使是十六进制)。使用“L”后缀将它们变成长整数 (Int64)。

    Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
    

    【讨论】:

      【解决方案3】:

      乍一看,我猜它正在与 Int32 进行乘法运算,并溢出。您需要将各个操作数转换为 Int64,然后将它们相乘。现在你只是在投射结果。

      也就是说,我不知道为什么它只会发现那一行而不是第一行的问题。

      ND

      【讨论】:

      • -1:Cast 需要编译器/JIT 来优化运行时转换。最好使用长文本开头。
      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2014-03-05
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多