天天看点

原码、补码、反码与移码

原码、补码、反码与移码

在现实生活中我们常常用“+”,“-”号来表示一个数的正负(真值),但是在计算机中无法用正负号表示,所以用二进制的最高位为1表示负,0表示正。而小数则用 ‘.’ 隔开符号位与数值,整数用‘,’号隔开。假设用5位表示,则+6为0,0110 -6则为1,0110 。+0.0001则表示为0.0001,-0.0001则表示为1.0001。

一、原码:

1.整数表示:

用最高位表示正负的二进制代码称为原码,如上所述。

而负数如-6 : 1,0110。相当于0110加上10000(10000-(-0110)) 即24。

所以原码的表达式可以写成:

原码、补码、反码与移码

注:这里2n和-2n取不到,因为最高位为符号位,那么最大也只能为0,1111即24-1,最小为1,1111即-(24-1) = -24+1。而0有两种表示,即0,0000或1,0000(24+0)

所以原码整数0有两种表示方法

2.小数:

小数-0.0001可以表示为1.0001,相当于0.0001加上1。

所以小数原码表达式为:

原码、补码、反码与移码

小数0也有两种表示即0.0000和1.0000。

二、补码

以时钟为例,当从6点到4点可以用6-2 = 4或6+10 = 16,再对16模12余4。所以减一个数相当于加上这个数的补数。例:10-2 = 8 也可写成10 + 8 = 18 再模10余8。而上面的12(钟)和10都是当两个数相加满了的时候进一位所代表的值。而相应的补数是用12或10减去之前的2来得到的。

1.整数:

如-1011,首先对其取补数用10000+(-1011)= 00101。但是怎么来区分0,0101是-1011的补数还是只是+1011?所以我们用最高位为1表示为负数的补数(相当于加上24)。所以-1011的补数为1,0101。

所以0,1010(10)-0,1011(11) = 0,1010+1,0101 = 1,1111(-1)。

注: 这里1,0101最高位即符号位也参与了运算。

所以整数补码表达式如下:

原码、补码、反码与移码

这里为2n+1是因为第一次求补数加了2n,然后用最高位为1表示是负数的补数又加了2n。-2n能取到因为2n+1-2n=2n,所以-24为1,0000。这里的0只有一种表示形式因为10,0000 + 0 = 10,0000而因为只能用5位表示所以最高位的1被舍掉,所以0表示为0,0000与+0一样。

所以补码的0只有一种表示。

2.小数:

原码、补码、反码与移码

三、反码

1.整数:

如上面10000+(-1011)= 00101所述,10000可以写成0,1111+1

所以上面可以写成0,1111-1011+1即0,0101+1。因为二进制中只有0、1,所以1减去一个数,相当于对这个数取反。

所以补码又可以用一种更快的方式表示,即除符号位外,其他位取反,然后得到的值再加上1。如-1011即1,1011的补码可以表示为1,0100+1=1,0101。

而取反得到的1,1011为反码。

正数的反码与原码、补码一样,所以反码整数的表达式为:

原码、补码、反码与移码

0有两种表示0,0000和0,1111。

所以反码的0有两种表示方法。

2.小数:

原码、补码、反码与移码

四、移码

有时候当看补码无法看出大小,如1,0101(-1011)和0,1111可能会误以为1,0101更大,所以为了更好的区分,把两位数都加10000得到0,0101和1,1111注意这里的1在移码中只是一个数,不是符号位。

所以移码的表达式为2n+x,x为真值。

计算机中数大多都用补码表示,因为:

1.补码中0只有一种表示形式。

2.补码符号位也参与了计算。

3.由于0只用一种表示法,则可以多表示一位负数。

4.用补码后,减法变成了加法,计算机只用做加法,不用专门设置减法器了。

继续阅读