Сначала предположим, что мы находимся в 32-битной системе с двумя представлениями дополнения, где INT_MIN
значение совпадает с -INT_MAX - 1
.
Это выражение:
(int) -2147483648/(int) -1
эквивалентно
(int) -2147483648/-1
поскольку -1
уже имеет тип int
.
В системе дополнений 32-bit
, где INT_MAX
находится 2147483647
, значение 2147483648
имеет тип long
1) , поскольку он не может быть представлен в int
. Значение -2147483648
также имеет тип long
.
Значение long
-2147483648
может быть представлено в int
, а значение после целочисленного преобразования (int) -2147483648
является INT_MIN
.
Исходное выражение тогда эквивалентно (по нашим предположениям):
INT_MIN/-1
and this expression эквивалентно INT_MAX + 1
which is not representable in an int
. Indeed int
type range goes from INT_MIN
to INT_MAX
. The expression is an integer overflow and integer overflow invokes undefined behavior in C.
(C99, 6.5p5) «Если при оценке выражения возникает исключительное условие (то есть, если результат не определен математически или нет в диапазоне представляемых значений для его типа), поведение не определено. «
1) We implicitly assume LONG_MAX
is > INT_MAX
, otherwise the value 2147483648
is of type long long
.