Наткнувшись на этот относительно старый пост совершенно случайно, я подумал, что уместно развить предыдущую гипотезу Вольта для неопытных читателей.
Во-первых, подписанный диапазон 128-битного числа составляет от -2 127 до 2 127 -1, а не от -2 127 до 2 127, как было предусмотрено изначально.
Во-вторых, из-за циклической природы конечной арифметики наибольшая требуемая разность между двумя 128-битными числами составляет от -2 127 до 2 127 -1, что требует наличия хранилища 128 бит, а не 129. Хотя (2 127 -1) - (-2 127) = 2 128 -1, что явно больше чем наше максимальное положительное целое число 2 127 -1, арифметическое переполнение всегда гарантирует, что ближайшее расстояние между любыми двумя n -битными числами всегда будет в диапазоне от 0 до 2 n -1 и, следовательно, неявно от -2 n -1 до 2 n - 1 -1.
Чтобы прояснить ситуацию, давайте сначала рассмотрим, как гипотетический 3-битный процессор будет реализовывать двоичное сложение. В качестве примера рассмотрим следующую таблицу, в которой показан абсолютный беззнаковый диапазон 3-битного целого числа.
0 = 000b
1 = 001b
2 = 010b
3 = 011b
4 = 100b
5 = 101b
6 = 110b
7 = 111b ---> [ Циклический возврат к 000b при переполнении]
Из приведенной выше таблицы легко очевидно, что:
001b (1) + 010b (2) = 011b (3)
Также очевидно, что добавление любого из этих чисел с его числовым дополнением всегда дает 2 n -1:
010b (2) + 101b ([дополнение 2] = 5) = 111b (7) = (2 3 -1)
Из-за циклического переполнения, которое происходит, когда сложение двух n -битных чисел приводит к (n +1) -битному результату, отсюда следует, что добавление любого из этих числа с его числовым дополнением + 1 всегда будут давать 0:
010b (2) + 110b ([дополнение 2] + 1) = 000b (0)
Таким образом, мы можем сказать, что [дополнение к n] + 1 = - n, так что n + [дополнение к n i>] + 1 = n + (- n) = 0. Кроме того, если мы теперь знаем, что n + [дополнение к n] + 1 = 0, тогда n + [дополнение n - x] + 1 must = n - (n - x) = x.
Применяя это к нашей исходной 3-битной таблице, получаем:
0 = 000b = [дополнение из 0] + 1 = 0
1 = 001b = [дополнение из 7] + 1 = -7
2 = 010b = [дополнение из 6] + 1 = -6
3 = 011b = [дополнение из 5] + 1 = -5
4 = 100b = [дополнение из 4] + 1 = -4
5 = 101b = [дополнение из 3] + 1 = -3
6 = 110b = [дополнение 2] + 1 = -2
7 = 111b = [дополнение 1] + 1 = -1 ---> [Циклический возврат к 000b при переполнении]
Независимо от того, является ли репрезентативная абстракция положительной, отрицательной или комбинацией того и другого, как подразумевается в арифметике с дополнением до двух со знаком, теперь у нас есть 2 n n - битовые шаблоны, которые могут беспрепятственно обслуживать как положительные 0 до 2 n -1, так и отрицательные 0 до - (2 n ) -1 изменяется по мере необходимости. Фактически, все современные процессоры используют именно такую систему, чтобы реализовать общую схему ALU как для операций сложения, так и для операций вычитания. Когда ЦП встречает команду вычитания i1 - i2
, он внутренне выполняет операцию [дополнение + 1] над i2
и впоследствии обрабатывает операнды через схему сложения, чтобы вычислить i1
+ [дополнение к i2
] + 1. За исключением дополнительного Флаг переполнения с переносом / знаком XOR-gated, сложение как со знаком, так и без знака, а также косвенное вычитание являются неявными.
Если мы применим приведенную выше таблицу к входной последовательности [-2 n -1, 2 n -1 - 1, -2 n -1], как представлено в исходном ответе Вольта, теперь мы можем вычислить следующие n-битные разности:
разница № 1:
(2 n -1 -1) - (-2 n -1 ) =
3 - (-4) = 3 + 4 =
(-1) = 7 = 111b
разница № 2:
(-2 n -1) - (2 n -1 -1 ) =
(-4) - 3 = (-4) + (5) =
(-7) = 1 = 001b
Начиная с нашего seed -2 n -1, теперь мы можем воспроизвести исходную входную последовательность, последовательно применяя каждый из вышеуказанных дифференциалов:
(-2 n -1) + (diff # 1) =
(-4) + 7 = 3 =
2 п -1 -1
(2 n -1 -1) + (diff # 2) =
3 + (-7) = (-4) =
-2 < sup> n -1
Вы, конечно, можете принять более философский подход к этой проблеме и предположить, почему 2 n циклически последовательных числа потребуют более 2 n циклически-последовательных дифференциалов?
Талиадон.
person
Taliadon
schedule
29.05.2010