Ссылка на код демонстрации
По причинам производительности компилятор Haxe не осуществляет переполнения. Задача проверки на переполнения лежит на конечной платформе. Вот несколько примеров поведения при переполнении на разных платформах:
- С++, Java, C#, Neko, Flash: 32-битное целое число со знаком с обычным поведением при переполнении
- PHP, JS, Flash 8: нет типа int, потеря точности случится в случае достижения лимита float($2^{52}$)
В качестве альтернативы можно использовать классы Int32 и Int64 для уверенности, что будет правильное поведение при переполнении независимо от платформы, но ценой дополнительных вычислений в зависимости от платформы.
Пример поведения при переполнении продемонстрирован в коде ниже. Переменная i, выходя за пределы Int, приобретает отрицательное значение, а затем при декременте на единицу — крайнее положительное значение
1 2 3 4 5 6 7 8 9 10 11 12 |
class Main { static function main() { var i:Int = 2147483647; trace(i); i++; trace(i); i--; trace(i); } } |
Заметка: данный код следует выполнять в среде HaxeDevelop, так как на Try Haxe! он (код) приобретает другое поведение
- e-olymp 2162. Палиндром - 06.06.2017
- 2.1.2 Переполнение - 04.06.2017
- e-olymp 2163. Сообразим на троих! - 13.05.2017
— Где результаты Ваших экспериментов? Где Ваш код?
— Замените «доп. расчетов » на «дополнительных вычислений».
Добавила код, проверьте, пожалуйста
Этот код можно как-нибудь выполнить? Например, на try.haxe.org?
Добавила ссылку, однако его лучше не запускать. Как минимум браузер начнёт сильно тормозить
Совершенно не удивительно — у Вас там бесконечный цикл. Я пытался подвести Вас к мысли, что Ваш код не является удачной демонстрацией.
У меня есть предложение: продемонстрируйте переполнение одним сложением с единицей.
Если получится, развивайте успех, займитесь вычитанием единицы.
Исправила пример, однако он не демонстрирует то поведение, о котором речь идёт выше, на Try Haxe, поэтому его лучше запускать на HaxeDevelop
Да, я заметил. Там реализована длинная арифметика.