为什么这一具体操作的溢出(cf。CS0220)在C#?
-
23-08-2019 - |
题
我尝试建造一个大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
不隶属于 StackOverflow