💻IT
🍵Программирование
🤖ИИ
⚡️Электроника
📼Ретро
Мои ламповые рукописные заметки без сои, ГМО и GPT
TG: @NeonAether
Post #28
242
Грамота от Кузьмича Присылаю вам пламенный привет🔥💌 с прошедшей конференции Dump из Питера! На конфе было круто - есть треки докладов по фронт, бек-разработке, менеджменту и тестированию. (А вот в Питере сейчас не круто - дубак и ветруган🥶) Доклады огонь, спикеры топ, но сегодня…
Ну и окей, нам то че с того? Вот мы с вами когда пользуемся операторами +,-,*,/ - никогда не паримся, просто держим в голове что если числа с которыми мы делаем вычисления будут слишком большими - надо будет или делать до вычисления какую-нибудь проверку, или работать с long/BigInteger, или с Math.addExact(), тут джекичанских путей решения этой задачи хватает. В чем тогда бага этой строки?
Если представить это выражение чисто в виде используемых типов - проблема станет очевиднее (нет):
Целевой тип с которым мы работаем - long. А в части (1 << j) - мы получаем результат int, который воткнется в проблему переполнения раньше чем long. Поэтому что бы поправить ошибку - в коде надо явно указать что побитовый сдвиг мы делаем для long:
Похожая ошибка на более простом кейсе - как если написать код:
И расстраиваться почему это у нас для больших чисел некорректно идет умножение. Фикс:
Выводы. Их несколько.
- Математика, типы, циклы и условия - только и ждут чтобы поиметь вас, поэтому знайте врага в лицо и будьте бдительны:)
- Баги встречаются везде, даже в крупнейших проектах. Тесты и автотесты - самое годное оружие против них. Напиши автотест - сделай мир лучше!
val = val | (1 << j);Если представить это выражение чисто в виде используемых типов - проблема станет очевиднее (нет):
long = long | (int << int);Целевой тип с которым мы работаем - long. А в части (1 << j) - мы получаем результат int, который воткнется в проблему переполнения раньше чем long. Поэтому что бы поправить ошибку - в коде надо явно указать что побитовый сдвиг мы делаем для long:
val = val | (1L << j);Похожая ошибка на более простом кейсе - как если написать код:
int a = ...; //любое значение
long result = 2 * a; //результат умножения - int
И расстраиваться почему это у нас для больших чисел некорректно идет умножение. Фикс:
long result = 2L * a; //результат умножения - longВыводы. Их несколько.
- Математика, типы, циклы и условия - только и ждут чтобы поиметь вас, поэтому знайте врага в лицо и будьте бдительны:)
- Баги встречаются везде, даже в крупнейших проектах. Тесты и автотесты - самое годное оружие против них. Напиши автотест - сделай мир лучше!
- 🔥 4
- ❤ 1
- 🙏 1








