Страницы

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

четверг, 20 декабря 2018 г.

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

Почему получается разный результат:
__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 }


Ответ

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

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

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