Страницы

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

среда, 29 января 2020 г.

В переменную int некорректно записывается произведение двух больших чисел

#cpp #типы_данных #арифметика


long long int var=100000*100000;


В var оказывается 1410065408, хотя 100000^2=10 000 000 000. Почему так?
    


Ответы

Ответ 1



Потому что числа - int, умножаются, как int, и дают в результате int с урезанным переполнением: 10000000000 в шестнадцатеричной записи - 2540BE400. Обрезая до 4 байт, имеем 540BE400, или 1410065408. Попробуйте явно указать, что вы умножаете long long'и - не пожалеете :) long long int var=100000ll*100000ll;

Ответ 2



В таких ситуациях для избежания переполнения и обеспечения типонезависимости кода можно порекомендовать реализовывать операцию умножения в два этапа long long int var = 100000; var *= 100000; Это позволить вам избежать ненужного повторения явной типизации, т.е. явной привязки ваших констант к конкретным типам. Альтернативным вариантом, уместным в некоторых контекстах, будет перенести явную типизацию в правую часть auto var = 100000ll * 100000;

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

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