1

我尝试构建一个大的 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 << 28) 时也会出现该错误。

4

3 回答 3

2

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

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

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
于 2009-04-03T09:53:23.690 回答
1

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

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
于 2009-04-03T09:53:48.947 回答
-1

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

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

ND

于 2009-04-03T09:52:27.750 回答