Re[16]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.06.20 09:25
Оценка: 1 (1)
Здравствуйте, Sharov, Вы писали:

N>>Тики по GetTickCount специально рассчитаны на такой режим. Но у тебя это работает потому, что в C/C++ unsigned уже гарантированно сделано арифметикой по модулю.

N>>В Ada это отдельный тип чисел: "type counter32 = modulo 2**32" и т.п. (модуль не обязан быть степенью двойки). Вот там, да, штатно такая арифметика (без защиты на заворот).

S>Что подразумевается под защитой на заворот -- исключения или какая-то манифестация при переполнении?


Генерация исключения.
Повторить в 5 минут:
Берём код, кладём в aplusb.adb.
Запустить gnatmake aplusb.adb.
Запускаем программу, пишем ввод и получаем:

$ ./aplusb 
2147483647
1

raised CONSTRAINT_ERROR : aplusb.adb:7 overflow check failed


Аналогично со второй программой рядом с ограниченными типами, если выйти за диапазон, но я расширил Input_Values до 1002:

$ ./a_plus_b 
1999

raised CONSTRAINT_ERROR : a_plus_b.adb:9 range check failed
$ ./a_plus_b 
1002
1002

raised CONSTRAINT_ERROR : a_plus_b.adb:11 range check failed


Да, эта проверка чего-то стоит (иногда — дорого). Но специфика обязывает.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.