二进制补码(二进制补码)
一、二进制的补码怎么算
在计算机系统中,数值,一律采用补码表示和存放。
计算机中,不没有原码和反码。
所以,只要掌握“数值与补码”的转换就可以了。
补码,其实,就是一个“代表负数参加运算”的正数。
用补码代替负数,计算机中,就没有负数了。
同时,在计算机中,也就没有减法运算了。
那么,计算机,只需一个加法器,就可以吃遍天下了。
------------------
补码(一个正数),它怎么就能代替负数呢?
用 10进制说明,比较容易理解。比如:
25- 1= 24
25+ 99=(一百) 24。
如果你只取 2位数,超出 2位的进位,你把它舍弃!
那么,+99,是不是就和-1,是等效的?
同样,+98就可以代替-2。
。。。
替换关系式:正数=负数+ 10^n,
n是位数。
10^n是 n位数的计数周期。
----------------------
在计算机中,每次参加运算的位数,也是有限的。
在 8位 2进制数时,计数周期就是 2^8= 256。
-1就可以用-1+ 256= 255代替。
即:
-1的补码,就是 255= 1111 1111(二进制)。
-2的补码,就是 254= 1111 1110。
。。。
求补码,就这么算。
补码的来历,与原码反码,都没有任何关系。
举例,5- 7=-2,用八位补码计算如下:
5= 0000 0101
[-7]补码= 1111 1001
--相加-------------
得:(1)1111 1110= [-2]补码
舍弃进位,结果,就是正确的。
二、二进制补码怎么算
1、在计算机系统中,数值一律用补码来表示(存储)。主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。数值的补码表示也分两种情况:(1)正数的补码:与原码相同。例如,+9的补码是00001001。(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码 0000111按位取反为1111000;再加1,所以-7的补码是11111001。已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。我在这里稍微介绍一下“模”的概念:“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6另一种是顺拨8小时:10+8=12+6=6在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2(8)。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。另外两个概念一的补码(one's complement)指的是正数=原码,负数=反码而二的补码(two's complement)指的就是通常所指的补码
三、二进制数的补码怎么求
二进制数的补码怎么求如下:
二进制补码的运算法则是0+0=0,向前进位为0;1+1=0,向前进位为1;1+0=1向前进位为0。运算结果如果最高位为零,则结果为正,最高位为一,结果为负。补码运算的结果仍然是补码。
1、二进制补码的计算方法:
二进制的补码计算非常简单,各种教材中也经常使用二进制来说明源码、反码与补码三者的关系,掌握一定基础的人都知道一下规则:
(1)原码。
最高位为符号位,0表示正数,1表示负数。
例如:X=0b11(3),四比特表示原码=0011(3);
X=-0b11(-3),四比特表示原码=1011(11);
(2)反码。
最高位为符号位,0表示正数,1表示负数。正数的反码等于本身,负数的反码除符号位外,各位取反。
例如:X=0b11(3),四比特表示原码=0011(3),对应反码为=0011(3);
X=-0b11(-3),四比特表示原码=1011(11),对应反码为=1100(12);
(3)补码。
最高位为符号位,0表示正数,1表示负数。
正数的补码等于本身,负数的补码等于反码+1:
例如:X=0b11(3),四比特表示原码=0011(3),对应反码为=0011(3),补码为=0011(3);
X=-0b11(-3),四比特表示原码=1011(11),对应反码为=1100(12),补码为1101(13);
2、十进制补码的计算方法:
对于十进制数来说,通过前面的性质不难得到正十进制数补码等于其本身,对于负十进制数来说如果还按位进行运算就太麻烦了!为了讲明白,我们从补码的起因说起:
“反码加一”只是补码所具有的一个性质,不能被定义成补码。负数的补码,是能够和其相反数相加通过溢出从而使计算机内计算结果变为0的二进制码。这是补码设计的初衷,具体目标就是让1+(-1)=0,这利用原码是无法得到的:
0001(1)+1001(-1)=1010(-2)。
而在补码中:
0001(1补)+1111(-1补)=10000(1溢出)。
所以对于一个n位的负数-X,有如下关系:X补+(-X)补=100...0=2n。
所以假设寄存器是n位的,那么-X的补码,应该是2n−X的二进制编码。