用简单语言定义二进制补码

我一直在网上搜索,但是如果不使用算法和数学运算,就找不到二进制补码的简单定义,只是为了确认这一点:

Two的补码基本上是将数字的符号恢复为二进制,因此,如果我有2,则将其转换为-2;如果得到-2,则将其转换为{{1} }。是吗?

nzjnzj 回答:用简单语言定义二进制补码

固定宽度二进制数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; }

因此,总而言之,二进制补码不一定是数学取反-它是计算机架构可以解释为取反的数字的二进制表示形式的转换,如果是,则可以简化该计算机架构上的数学运算。

本文链接:https://www.f2er.com/2730910.html

大家都在问