Переполнение / недостаточность математически правильно определены для целочисленной арифметики фиксированного размера:
(1 - 0xFFFFFFFF) % (1<<32) =
(1 + -0xFFFFFFFF) % (1<<32) =
1 + (-0xFFFFFFFF % (1<<32)) = 2
Это равно правильному результату!
В частности, результат послеover / underflow - псевдоним правильного целого числа.Фактически, каждое непредставимое целое число является псевдонимом (неразличимым) с одним представимым целым числом - считайте до бесконечности в целых числах фиксированного размера, и вы будете повторять себя, округляя и округляя, как циферблат аналоговых часов.
N-разрядное целое число представляет собой любое действительное целое число по модулю 2 ^ N.В C по модулю 2 ^ N записывается как% (1 << 32). </p>
Я считаю, что C гарантирует математическую корректность переполнения / недополнения, но только для целых чисел без знака.Считается, что знак / переполнение никогда не происходит (для оптимизации).
На практике целые числа со знаком - это дополнение к двум, что не имеет значения при сложении или вычитании, поэтому правильное поведение при переполнении / переполнении гарантируется дляцелые числа со знаком (хотя и не C).