INT_MIN * INT_MIN = 0 (c)

почему минимальный инт в квадрате равен нулю?


Ответы (2 шт):

Автор решения: Zhihar

потому что минимальный INT - это -2147483648 или в бинарном виде

10000000 00000000 00000000 00000000

квадрат этого числа:

10000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000

но если у нас 32битная система, то тогда квадрат равен...

00000000 00000000 00000000 0000000

что и равно 0

если бы вы выполнили код

__int64 x = -2147483648;
__int64 y = x * x;

то конечно никакого нуля вы бы не получили, а получили бы 4611686018427387904

→ Ссылка
Автор решения: Fat-Zer

INT_MIN * INT_MIN вызывает целочисленное переполнение, а переполнение знаковых типов Си — это неопределённое поведение (UB, undefined behaviour), что может дать любой результат — INT_MIN, INT_MAX, 0 или, например, 42.


На практике на подавляющем большинстве архитектур сегодня отрицательные числа представляются дополнительным кодом, а после выполнения арифметических действия с ними результат, выходящий, за пределы регистра просто отбрасывается. В данном случае вычисления будут выглядеть как-то так:

                  доп. код  знак           прям. код
  INT_MIN     0x 8000 0000 => 1            8000 0000
* INT_MIN     0x 8000 0000 => 1            8000 0000
 -----------------------------v--vvvvvvvvvvvvvvvvvvv
  INT_MIN^2                   0  4000 0000 0000 0000
              0x 0000 0000 <= 0            0000 0000 

Но полагаться на это, конечно, нельзя. Алгоритм вычислений конкретного процессора может отличаться, а компилятор вправе сделать вместо этого вообще что угодно.

→ Ссылка