#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;
Комментариев нет:
Отправить комментарий