我尝试构造一个大的 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).
时也会出现错误您需要将常量值专门标记为长整型(Int64s)或可能的ulongs(UInt64s),否则默认情况下它们将被解释为整数(即Int32s),显然会导致溢出。在这种情况下,乘法运算之后的转换不会给你带来任何好处。
尚未测试,但此代码应该可以工作:
Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
整数文字的类型为 Int32(即使是十六进制)。使用“L”后缀使它们成为长数(Int64)。
Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
乍一看,我猜它正在与 Int32 进行乘法运算,并且溢出。您需要将各个操作数转换为 Int64,然后将它们相乘。现在您只需投射结果。
也就是说,我不知道为什么它只会发现该行的问题,而不是第一个数字较大的行。
ND