我一直在网上搜索,但是如果不使用算法和数学运算,就找不到二进制补码的简单定义,只是为了确认这一点:
Two的补码基本上是将数字的符号恢复为二进制,因此,如果我有2
,则将其转换为-2
;如果得到-2
,则将其转换为{{1} }。是吗?
我一直在网上搜索,但是如果不使用算法和数学运算,就找不到二进制补码的简单定义,只是为了确认这一点:
Two的补码基本上是将数字的符号恢复为二进制,因此,如果我有2
,则将其转换为-2
;如果得到-2
,则将其转换为{{1} }。是吗?
固定宽度二进制数X的2的补码是通过将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)
。)
例如,在对负数使用二进制补码表示的体系结构上的加法(或减法)将使用与相应的无符号加法(或减法)相同的指令,并且无论操作数的符号如何,它都将起作用。
在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; }
因此,总而言之,二进制补码不一定是数学取反-它是计算机架构可以解释为取反的数字的二进制表示形式的转换,如果是,则可以简化该计算机架构上的数学运算。