我尝试建造一个大Int64与四位信息储存在字节。

下列代码行工作的预期:

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

为什么以下行导致一个编译错误CS0220"的操作溢出在编制时在托模式"和别人不一样?

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

结果将是:

FFFFFFFFD0000000

代替:

0000D0000000

任何人都可以解释这个吗?现在,我将转换与移的经营者,但还是好奇为什么这种方法不工作!

更新:错误也出现在使用(Int64)(0x0d << 28段)。

有帮助吗?

解决方案

你需要标记的恒定值具体如longs(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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top