Случайно наткнувшись на этот относительно старый пост совершенно случайно, я подумал, что уместно уточнить предыдущую гипотезу Вольта в пользу неопытных читателей.
Во-первых, диапазон со знаком 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 ] + 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-закрытого флага переполнения переноса / знака, как неявное, так и сложное со знаком и без знака, неявно.
Если применить приведенную выше таблицу к последовательности ввода [-2 n -1 , 2 n -1 -1 , -2 n -1 ], как представлено в исходном ответе Вольте, теперь мы можем вычислить следующие n-битные дифференциалы:
diff # 1:
(2 n -1 -1) - (-2 n -1 ) =
3 - (-4) = 3 + 4 =
(-1) = 7 = 111b
diff # 2:
(-2 n -1 ) - (2 n -1 -1) =
(-4) - 3 = (-4) + (5) =
(-7) = 1 = 001b
Начиная с нашего начального числа -2 n -1 , теперь мы можем воспроизводить исходную входную последовательность, последовательно применяя каждый из вышеуказанных дифференциалов:
(-2 n -1 ) + (diff # 1) =
(-4) + 7 = 3 =
2 п * +1191 * -1 * * -1 тысяча сто девяносто-два
(2 n -1 -1) + (diff # 2) =
3 + (-7) = (-4) =
-2 * * п тысячу двести две -1
Вы, конечно, можете принять более философский подход к этой проблеме и предположить, почему для 2 n циклически-последовательных чисел потребуется более 2 n циклически-последовательные дифференциалы?
Taliadon.