Здравствуйте, 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
Да, эта проверка чего-то стоит (иногда — дорого). Но специфика обязывает.