为什么这个特定操作在 C# 中会溢出(参见 CS0220)?

问题描述 投票:0回答:3

我尝试构造一个大的 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 compiling time in checked mode”而其他行则不会?

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

结果将是:

FFFFFFFFD0000000

而不是:

0000D0000000

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

更新:使用(Int64)(0x0d << 28).

时也会出现错误
c# overflow
3个回答
2
投票

您需要将常量值专门标记为长整型(Int64s)或可能的ulongs(UInt64s),否则默认情况下它们将被解释为整数(即Int32s),显然会导致溢出。在这种情况下,乘法运算之后的转换不会给你带来任何好处。

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

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

1
投票

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

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

-1
投票

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

也就是说,我不知道为什么它只会发现该行的问题,而不是第一个数字较大的行。

ND

© www.soinside.com 2019 - 2024. All rights reserved.