Over/сгущенного математически четко определены для фиксированного размера целочисленной арифметики:
(1 - 0xFFFFFFFF) % (1<<32) =
(1 + -0xFFFFFFFF) % (1<<32) =
1 + (-0xFFFFFFFF % (1<<32)) = 2
Это является правильный результат!
В частности, результат после over/underflow является псевдонимом правильного целого. На самом деле, каждое не представимое целое число является псевдонимом (неразличимым) с одним представляемым целым числом - счетчиком до бесконечности в целых числах фиксированного размера, и вы будете повторяться, круглые и круглые, как циферблат аналоговых часов.
N-разрядное целое представляет любое действительное целое число по модулю 2^N. В C по модулю 2^N записывается как% (1 < < 32).
Я считаю, что C гарантирует правильность математической корректности over/underflow, но только для целых чисел без знака. Предполагается, что под/переполнением никогда не будет (ради оптимизации).
На практике целые числа со знаком являются дополнением двух, что не делает различий в добавлении или вычитании, поэтому правильное поведение под/переполнением гарантируется и для целых чисел со знаком (хотя и не с помощью C).
+1 Ударьте его на несколько секунд. Хорошая рытье! – templatetypedef
+1 Ничего себе, я (очевидно) никогда не знал, что эта неопределенность была частью стандарта. Но, в данном случае, это не 'ptrdiff_t' просто прославленный' signed size_t'? – Mehrdad
@templatetypedef: Я рад, на этот раз, чтобы не проснуться после битвы сражался :) @Mehrdad: Я бы сказал, что это :) С другой стороны, ничто не запрещает стандартную реализацию библиотеки, которую вы используете для использования 64 -бит целых чисел даже на 32-битной платформе. Стандарт только говорит, что для них не обязательно прилагать усилия. Остальное - проблема качества реализации. –