Вычитание 2 отрицательного целого числа (дополнения до двух) никогда не переполняется - PullRequest
0 голосов
/ 25 сентября 2011

Я сталкивался с этим в учебнике по компьютерной архитектуре:

Вычитание строго отрицательного целого числа из другого строго отрицательного целого числа (в дополнение к двум) никогда не будет переполнено.Учебник не объясняет это утверждение.Это пробудило мое любопытство.

Почему это утверждение верно?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011

Вот как это работает для 32-битных целых чисел. Он работает так же для любой другой длины в битах.

Самое большое отрицательное число - -1.

Наименьшее отрицательное число -2 ^ 31.

Переполнение происходит, если результат больше или равен 2 ^ 31 или меньше, чем -2 ^ 31.

Вы получаете наибольший результат вычитания, вычитая наименьшее число из наибольшего. -1 - (-2 ^ 31) = 2 ^ 31 - 1. Это достаточно мало.

Вы получаете наименьший результат вычитания, вычитая наибольшее число из наименьшего. -2 ^ 31 - (-1) = - (2 ^ 31 - 1). Это больше, чем -2 ^ 31.

0 голосов
/ 25 сентября 2011

Поскольку диапазон целых чисел со знаком минус составляет от -1 до -(MAX_INT+1), диапазон возможных различий между двумя такими числами составляет от -MAX_INT до MAX_INT. Поскольку этот диапазон легко представим (помните, что полный целочисленный диапазон со знаком от -(MAX_INT+1) до MAX_INT), то, очевидно, переполнения никогда не будет.

0 голосов
/ 25 сентября 2011

диапазон чисел, которые могут быть получены с помощью такого вычитания, равен [MIN_INT + 1, MAX_INT] и, таким образом, никогда не будет переполнен.
почему?
пусть будет MIN_INT <= x,y < 0 так: MIN_INT = MIN_INT-0 < x-y < 0-MIN_INT = MAX_INT+1
И, таким образом, MIN_INT < x-y < MAX_INT + 1 обратите внимание, что "сильный" < предотвращает переполнение.

...