Предположим, что есть два целых числа (int x, y;
).x
отрицательное, а y = 0x80000000
.
Почему (x - y)
не переполняется, а x + (-y)
переполняется?
Разве компьютер не выполняет вычитание путем сложения?
Предположим, что есть два целых числа (int x, y;
).x
отрицательное, а y = 0x80000000
.
Почему (x - y)
не переполняется, а x + (-y)
переполняется?
Разве компьютер не выполняет вычитание путем сложения?
Чтобы ответить на ваш первый вопрос, 0x80000000 (-2 147 483 648) представляет минимальное 32-битное значение для целых чисел со знаком. 2 147 483 647 — максимальное значение. Величина максимального значения на единицу меньше величины минимального значения при сохранении с использованием дополнения до двух а>. Взять только (-y)
невозможно, так как оно превышает максимальное значение (на 1). Окончательное целочисленное значение (x-y)
находится в диапазоне (учитывая, что x
отрицательное) и может быть представлено 32-битным целым числом.
Чтобы ответить на ваш второй вопрос, вычитание достигается путем преобразования числа, которое нужно вычесть, в его аддитивную инверсию. Учитывая возможность переполнения в этой ситуации, ваш компилятор может получить правильный результат для (x-y)
, выполнив -((-x)+y)
. Однако это чистое предположение (это единственный способ сделать это безопасно).