我的代码乘以32位* 32位。
public static void RunSnippet()
{
System.Int32 x, y;
System.Int64 z;
System.Random rand = new System.Random(DateTime.Now.Millisecond);
for (int i = 0; i < 6; i++)
{
x = rand.Next(int.MinValue, int.MaxValue);
y = rand.Next(int.MinValue, int.MaxValue);
z = (x * y);
Console.WriteLine("{0} * {1} = {2}", x, y, z);
}
然而,结果并不完全符合我的预期。
这有什么问题?
答案 0 :(得分:10)
溢出。结果计算为32位整数,然后提升为64位。为避免这种情况,请在乘法之前将因子转换为64位。
System.Int32 x, y;
System.Int64 z;
System.Random rand = new System.Random(DateTime.Now.Millisecond);
for (int i = 0; i < 6; i++)
{
x = rand.Next(int.MinValue, int.MaxValue);
y = rand.Next(int.MinValue, int.MaxValue);
z = ((Int64)x * y); //by casting x, we "promote" the entire expression to 64-bit.
Console.WriteLine("{0} * {1} = {2}", x, y, z);
}
答案 1 :(得分:1)
在乘法中将x或y投射到Int64
。乘法的输出基于源类型,而不是目标类型。
答案 2 :(得分:0)
Int32 * Int32产生另一个Int32。结果是溢出。
尝试:
System.Int64 x, y;
答案 3 :(得分:0)
Int32 * Int32 == Int32
你需要在乘法
之前将x和y转换为Int64(Int64)Int32 *(Int64)Int32 == Int64