C#中32位* 32位数据的问题

时间:2012-02-22 20:06:54

标签: c# .net math int

我的代码乘以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);
    }

然而,结果并不完全符合我的预期。

enter image description here

这有什么问题?

4 个答案:

答案 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