Проблема с 32-битными * 32-битными данными в C # - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть этот код, который умножает на 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);
    }

Однако результат не совсем то, что я ожидал.Что с этим не так?

Ответы [ 4 ]

10 голосов
/ 23 февраля 2012

перелив. Результат рассчитывается как 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 голос
/ 23 февраля 2012

Приведите x или y к Int64 в умножении. Вывод умножения основан на типах источника, а не на типе назначения.

0 голосов
/ 23 февраля 2012

Int32 * Int32 == Int32

вам нужно привести x и y к Int64 до умножения

(Int64) Int32 * (Int64) Int32 == Int64

0 голосов
/ 23 февраля 2012

Int32 * Int32 возвращает другой Int32.Результат переполнен.

Попробуйте:

System.Int64 x, y;
...