Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Разные результаты при умножении больших чисел

#cpp #c


Почему получается разный результат:

__int64 f1()
{
    return 24 * 60 * 60 * 1000 * 1000;
}

__int64 f2()
{
    __int64 value = 24 * 60 * 60 * 1000;
    return value * 1000;
}

int main()
{
    __int64 value1 = f1(); //500654080
    __int64 value2 = f2(); //86400000000
}

    


Ответы

Ответ 1



Целочисленный литерал вроде 1000, 64 и т.п. имеет тип int и выражение с умножением этих чисел тоже имеет тип int. Итоговое значение не помещается в целовой тип (происходит переполнение, формально UB) и вы видите искаженные результаты. При сохранении промежуточного значения в более широкий тип, результат последующего умножения также будет иметь более широкий тип, который способен содержать итоговое произведение правильно. Чтобы заработал первый вариант, достаточно добавить к одному из литералов суффикс ll, таким образом превратив литерал из типа int в тип long long int.

Комментариев нет:

Отправить комментарий