Дополнение Two двоичного числа фиксированной ширины X - это двоичное число, которое вы получаете, инвертируя двоичные цифры X и добавляя единицу, исключая возможное переполнение.
twos_compl(X){ return ~X+1; }
Например, для чисел шириной 4 бита :
X ~X ~X+1
0000 1111 0000
0001 1110 1111
0010 1101 1110
0011 1100 1101
Если компьютерная архитектура использует два дополнения для представления математически отрицательных чисел со знаком, т. Е. Если twos_compl(X) == -X
, то некоторые математические операции становятся простыми в реализации.
(В таком случае представление числа со знаком, старший бит которого означает -pow(2,bit_index_from_the_right)
, а не обычное (обычно для чисел без знака и для любого другого бита в представлении дополнения со знаком два) +pow(2,bit_index_from_the_right)
.)
Например, сложение ( или вычитание) в архитектуре, которая использует представление дополнения до двух для отрицательных чисел, будет использовать ту же инструкцию, что и соответствующее сложенное без знака (или вычитание соответственно), и оно будет работать независимо от знака операндов.
In C на платформе дополнения до двух:
int sadd(int A, int B) { return A+B; }
unsigned uadd(unsigned A, unsigned B) { return A+B; }
будет компилироваться в та же самая инструкция.
И по определению дополнения до двух, так будет:
int neg(int A) { return -A; }
и
int neg2(int A) { return ~A+1; }
Таким образом, чтобы подвести итог, дополнение двух не обязательно математическое отрицание - это преобразование двоичного представления числа, которое архитектура компьютера может интерпретировать как отрицание, и если это так, это упрощает математику в этой архитектуре компьютера.