带符号数的原码、反码与补码分析
- 格式:docx
- 大小:231.24 KB
- 文档页数:6
带符号数的表示方法
在计算机里呀,带符号数有原码、反码和补码这几种表示方法。
先说说原码吧,原码可直接,它就是把数的符号用一位来表示,正数符号位是0,负数符号位是1,后面跟着这个数的绝对值的二进制表示。
比如说+5,它的原码就是00000101(假设是8位二进制数哦),那 -5的原码就是10000101。
原码很直观,就像咱们平时看数一样,一眼能看出是正还是负。
不过原码在计算的时候有点小麻烦呢。
这时候反码就登场啦。
对于正数,反码和原码是一样一样的。
但是负数的反码呢,就是把原码除了符号位之外的所有位都取反。
像 -5的原码是10000101,那它的反码就是11111010。
反码在做减法的时候会比原码方便一些哦。
补码就更酷啦。
正数的补码还是和原码一样。
负数的补码呢,是它的反码再加1。
还拿 -5来说,反码是11111010,那补码就是11111010 + 1 = 11111011。
补码在计算机里可太重要啦,计算机里很多运算都是用补码来进行的。
因为用补码计算的时候,减法可以当成加法来做,这样就大大简化了计算机的运算电路呢。
咱打个比方,就像你有两种方式去一个地方,原码可能是那种按部就班的走法,反码有点像是换了个思路走,而补码呢,就像是找到了一条超级捷径,能让计算机这个小机灵鬼更快地算出结果。
计算机中带符号数的表示之原码、补码、反码计算机中带符号数的表示之原码、补码、反码2010-09-13 12:47为叙述方便,先引进两个名词:机器数和真值。
将一个数在机器中的表示形式,即编码称为机器数,将数本身称为真值。
常用的机器数有三种:原码、补码和反码。
1.原码1)通俗定义将数的符号数码化,即用一个二进制位表示符号:对正数,该位取0,对负数,该位取1。
而数值部分保持数的原有形式(有时需要在高位部分添几个0)。
这样所得结果为该数的原码表示。
例,x=+1001010,y=-1001010,z=-1110(=-0001110)。
当原码为8位时,x、y和z的原码分别是:[x]原=01001010;[y]原=11001010;[Z]原=10001110.其中最高位为符号位。
2)正规定义其中,x为真值,n为原码的位数。
这个定义实际是将真值的范围给出来了,当n=8时,-127 x127,因而,其数值部分写成二进制形式,最多为7位。
从该定义可看出,x为正数时,其原码还是数本身,第8位(符号位)补0;x为负数时,-x等于去掉负号,但要加上127,即第8位为1(127=10000000(2))。
因此,这个定义和上面的通俗定义是一致的。
3)原码表示的特点原码表示有三个主要特点:一是直观,与真值转换很方便;二是进行乘、除运算方便;三是加、减运算比较麻烦。
第一点是显然的。
说原码表示进行乘、除运算方便是因为其数值部分保持了数据的原有形式,对数值部分进行乘或除就可得到积或商的数值部分,而积或商的符号位可由两个数原码的符号位进行逻辑运算而得到。
说原码表示进行加、减运算比较麻烦,以加法为例,两个数相加需先判别符号位,若其不同,实际要做减法,这时需再判断绝对值的大小,用绝对值大的数减绝对值小的数,最后还要决定结果的符号位。
2.补码1)补码的引进和定义据统计,在所有的运算中,加、减运算要占到80%以上,因此,能否方便地进行正、负数加、减运算,直接关系到计算机的运行效率。
原码、反码与补码知识讲解2.2 原码、反码与补码在计算机内的数(称之为“机器数”)值有3种表示法:原码、反码和补码。
所谓原码就是带正、负号的二进制数,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
由此可见,这三种表示法中,关键是负数的表示方式不一样。
2.2.1 正负数表示、定点数与浮点数在计算机内,通常把1个二进制数的最高位定义为符号位,用“0”表示正数,“1”表示负数;其余位表示数值。
规定小数点位置固定不变的数称为“定点数”;小数点的位置不固定,可以浮动的数称为“浮点数”。
2.2.2 原码原码表示法是定点数的一种简单的表示法。
用原码表示带符号二进制数时,符号位用0表示正,1表示负;数值位保持不变。
原码表示法又称为符号-数值表示法。
1. 小数原码表示法设有一数为x,则原码表示可记作[x]原(下标表示)。
例如,X1= +1010110 ;X2= -1001010原码表示数的范围与二进制位数有关。
设二进制小数X=±0.X1X2…Xm,则小数原码的定义如下:例如:X=+0.1011时,根据以上公式可得[X]原=0.1011;X=-0.1011时,根据以上公式可得[X]原= 1-(-0.1011)=1.1011=1.1011当用8位二进制来表示小数原码时,其表示范围为:最大值为0.1111111,其真值约为(0.99)10 ;最小值为1.1111111,其真值约为(-0.99)10。
根据定义,小数“0”的原码可以表示成0.0…0或1.0…0。
2. 整数原码表示法整数原码的定义如下:例如:X=+1101时,根据以上公式可得[X]原=01101;X=-1101时,根据以上公式可得[X]原=24-(-1101)=10000+1101=11101当用8位二进制来表示整数原码时,其表示范围为:最大值为01111111,其真值为(127)10 ;最小值为11111111,其真值为(-127)10 。
原码,反码,补码及运算一、定义 1.原码 正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。
用这样的表示方法得到的就是数的原码。
【例2.13】当机器字长为8位二进制数时:X=+1011011 [X]原码=01011011Y=+1011011 [Y]原码=11011011[+1]原码=00000001 [-1]原码=10000001[+127]原码=01111111 [-127]原码=11111111 原码表示的整数范围是: -(2n-1-1)~+(2n-1-1),其中n为机器字长。
则:8位二进制原码表示的整数范围是-127~+12716位二进制原码表示的整数范围是-32767~+32767 2.反码 对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【例2.14】当机器字长为8位二进制数时: X=+1011011 [X]原码=01011011 [X]反码=01011011 Y=-1011011 [Y]原码=11011011 [Y]反码=10100100 [+1]反码=00000001 [-1]反码=11111110 [+127]反码=01111111 [-127]反码=10000000 负数的反码与负数的原码有很大的区别,反码通常用作求补码过程中的中间形式。
反码表示的整数范围与原码相同。
3.补码 正数的补码与其原码相同,负数的补码为其反码在最低位加1。
引入补码以后,计算机中的加减运算都可以统一化为补码的加法运算,其符号位也参与运算。
【例2.15】(1)X=+1011011 (2)Y=-1011011 (1)根据定义有:[X]原码=01011011 [X]补码=01011011 (2)根据定义有:[Y]原码=11011011 [Y]反码=10100100 [Y]补码=10100101 补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。
原码、反码、补码的简单转换1、正数的原码、反码、补码是⼀样的如+1011111(95)的原码、反码、补码为:原码 0101 1111反码 0101 1111补码 0101 11112、负数的原码、反码、补码转换以-1011111(-95)的原码、补码、反码的转换为例:(1)负数原码、反码转换符号位不变,数值位按位取反原码转反码原码 1101 1111反码 1010 0000 //符号位不变,数值位按位取反反码转原码反码 1010 0000原码 1101 1111 //符号位不变,数值位按位取反(2)负数原码、补码转换符号位不变,数值位按位取反,末位+1原码转补码原码 1101 1111反码 1010 0000 //符号位不变,数值位按位取反补码 1010 0001 //末位+1快速求法为:符号位不变,从右往左找第⼀个1,这个1左边的取反,右边的不变补码转原码补码 1010 00011101 1110 //符号位不变,数值位按位取反为原码 1101 1111 //末位+1(3)负数反码、补码转换反码转补码,末位+1;补码转反码,末位-1反码转补码反码 1010 0000补码 1010 0001 //末位+1补码转反码补码 1010 0001反码 1010 0000 //末位-13、总结:正数的原码、补码、反码都⼀样;负数的原码、反码转换:符号位不变,数值位按位取反;负数的原码、补码转换:符号位不变,数值位按位取反,末位+1,【快速求法为:符号位不变,从右往左找第⼀个1,这个1左边的取反,右边的不变】;负数的反码、补码转换:反码转补码,末位+1;补码转反码,末位-1。
原码表示法:带符号数在机器中的表示方法就是原码表示法。
正数用0表示,负数用1表示。
例:+1001010的原码为01001010,-1001010的原码为11001010反码表示法:正数的反码和原码一样;负数的反码与原码不同,而是原码的符号位不变,数值部分逐步求反。
例1:反码表示+101。
先将其用八位二进制表示为00000101(第一位为符号位,0表示正数)再反码表示为00000101(正数原码补码相同)例2:反码表示-101.先将其用八位二进制表示为10000101(第一位为符号位,1表示负数)再反码表示为1111010(符号位不变,其余位求反即1变0,0变1)结论:用八位二进制表示一个数十反码最高位为符号位,当符号位为0(正数)时,后面7位与原码相同;符号位为1(负数)时,后面7位与原码相反。
补码表示法:正数的补码与原码相同,负数的补码等于它的反码末位加1.例1:原码:00000101,,其补码为00000101(正数补码原码相同)例2:原码:10000101,其补码为其反码加1,即为11111010+1=11111011原码与补码的相互转换:(仅负数,正数原码补码相同)1.原码转补码:符号位不变,数值部分求反加12.补码转原码:补码的补码即原码,即补码求反加1为原码。
课本后习题最后两题(P47)7.(1)+7原码为00000111,反码为00000111,补码为00000111-7原码为10000111,反码为11111000,补码为11111001(2)自己写(^.^)(^.^)(^.^)8.(1)补码11111111转换成原码为10000000+1=10000001,其真值为-1(2)嘿嘿嘿嘿嘿(3)^_~ ^_~ ^_~ ^_~ ^_~。
一.带符号数的原码、反码与补码所谓带符号数,其实就是一个二进制数据,它的最高位所代表的是符号,其余位是其“绝对值”。
例如0101_0011,这个数据如果是带符号数,那么最高位的0就是代表这个数据为正数,其后的101-0011则代表这个数据的绝对值,为+83D。
如果是1101_0011,则代表-83D。
1.1 原码原码就是按照正数的符号位为0,负数的符号位为1,其他位就是数据的绝对值即可。
例如当机器字长为8bit的二进制数时,它的最高位为符号位,因此其余的7bit位数据的绝对值。
因此原码所能表示的数据范围是:- (2n-1-1)~+(2n-1-1)当字长为8bit,则原码能表示的范围就是:-127~+127例如83的原码就是:0101_0011当字长为16bit,则原码能表示的范围就是:-32767~+32767例如-83的原码就是:1000_0000_0101_00111.2反码对于一个带有符号位的二进制数来说,正数的反码与其原码相同,负数的反码为其原码除符号位外其余各位按位取反。
例如当字长为8bit时,+83D的反码就是:0101_0011,-83D的反码就是1010_1100负数的反码与原码有很大的差别,一般情况下,反码主要用来当做求二进制数补码的中间形式。
反码所表示的数据范围与原码相同:- (2n-1-1)~+(2n-1-1)1.2补码正数的补码与其原码相同,负数的补码为其反码在最低位加1。
例如:X=+101_1011 [X]原码=0101_1011 [X]补码=0101_1011X=-101_1011 [X]原码=1101_1011 [X]补码=1010_0101补码表示的范围是:- 2n-1~+(2n-1-1)当字长为8bit,则原码能表示的范围就是:-128~+127当字长为16bit,则原码能表示的范围就是:-32768~+32767关于0,它有两个补码:正零:0000_0000负零:1000_0000二.通过补码求解原值的方法1)对于正数,它的原值与补码相同;2)对于负数,它的原值就是将补码除符号位以外,安位取反之后,末位加1。
原码、反码和补码 —— 带符号数的机器码表示方法1.带符号二进制数的表示方法:2、符号位的表示:最常用的表示方法有原码、反码和补码。
(1)原码表示法一个机器数x 由符号位和有效数值两部分组成,设符号位为x 0,x 真值的绝对值|x|=x 1x 2x 3...x n ,则x 的机器数原码可表示为:[x]原= n x x x x ...210,当x>=0时,x 0=0,当x<0时,x 0=1。
例如:已知:x 1=-1011B ,x 2= +1001B ,则x 1,x 2有原码分别是[x 1] 原=11011B ,[x 2]原=01001B规律:正数的原码是它本身,负数的原码是取绝对值后,在最高位(左端)补“1”。
(2)反码表示法一个负数的原码符号位不变,其余各位按位取反就是机器数的反码表示法。
正数的反码与原码相同。
按位取反的意思是该位上是1的,就变成0,该位上是0的就变成1。
即1=0,0=1例:B x 10111-=,B x 10012+=,求反][1x 和反][2x 。
解:反][1x =B 10100,反][2x =B 01001(3)补码表示法首先分析两个十进制数的运算:78-38=41,79+62=141如果使用两位数的运算器,做79+62时,多余的100因为超出了运算器两位数的范围而自动丢弃,这样在做78-38的减法时,用79+62的加法同样可以得到正确结果。
模是批一个计量系统的测量范围,其大小以计量进位制的基数为底数,位数为指数的幂。
如两位十进制数的测量范围是1——9,溢出量是100,模就是102=100,上述运算称为模运算,可以写作:79+(-38)=79+62 (mod 100)进一步写为 -38=62,此时就说 –38的补法(对模100而言)是62。
计算机是一种有限字长的数字系统,因此它的运算都是有模运算,超出模的运算结果都将溢出。
n 位二进制的模是2n ,一个数的补码记作[x]补,设模是M ,x 是真值,则补码的定义如下:⎩⎨⎧<+≥=)0()0(][][x x M x x x 原补例:设字长n=8位,x=-1011011B ,求[x]补。
大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即28(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~ 28-1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
比如我给你一个2个字节大小的二进制码,首先声明它表示的是无符号的整数:00000000 00000010,我们把前面的0省略,换算一下,它表示的也是数值2,和前面不同的是,它占了2个字节的内存。
不同的类型占的内存空间不同,如在我的电脑中char是1个字节,int是4个字节,long是8个字节(你的可能不同,这取决于不同的计算机设置),它们的不同之处仅仅是内存大的能表示的不同的信息多些,也就是能表示的数范围更大些(unsigned int能表示的范围是0~28*4-1),至于怎么算,其实都是一样的,直接把二进制与十进制相互转换,二进制就是它在计算机中的样子,十进制就是我们所表示的数(误解:不同的计算机储存的原理是不同的,取决于商家的喜好呢)。
原码,反码,补码及运算一、定义1.原码正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值。
用这样的表示方法得到的就是数的原码。
【基准2.13】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011y=+1011011[y]原码=11011011[+1]原码=00000001[-1]原码=10000001[+127]原码=01111111[-127]原码=11111111原码则表示的整数范围就是:-(2n-1-1)~+(2n-1-1),其中n为机器字长。
则:8十一位二进制原码则表示的整数范围就是-127~+12716十一位二进制原码则表示的整数范围就是-32767~+327672.反码对于一个带符号的数来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。
【基准2.14】当机器字长为8十一位二进制数时:x=+1011011[x]原码=01011011[x]反码=01011011y=-1011011[y]原码=11011011[y]反码=10100100[+1]反码=00000001[-1]反码=11111110[+127]反码=01111111[-127]反码=10000000负数的反码与负数的原码存有非常大的区别,反码通常用做谋补码过程中的中间形式。
反码则表示的整数范围与原码相同。
3.补码正数的补码与其原码相同,负数的补码为其反码在最低位加1。
导入补码以后,计算机中的以此类推运算都可以统一化成补码的乘法运算,其符号位也参予运算。
【例2.15】(1)x=+1011011(2)y=-1011011(1)根据定义存有:[x]原码=01011011[x]补码=01011011(2)根据定义存有:[y]原码=11011011[y]反码=10100100[y]补码=10100101补码表示的整数范围是-2n-1~+(2n-1-1),其中n为机器字长。
原码,反码,补码,移码的概念以及各⾃的⽤途和优点1.原码将最⾼位⽤作符号位(0表⽰正数,1表⽰负数),其余各位代表数值本⾝的绝对值的表⽰形式。
例如,假设⽤8位表⽰⼀个数,则+10的原码是00001010,-10的原码是10001010。
直接使⽤原码在计算时会有⿇烦,例如,(1)10+(-1)10=0。
如果直接使⽤原码,则(00000001)2+(10000001)2=(10000010)2这样计算的结果是-2也就是说,使⽤原码直接参与计算可能会出现错误的结果。
所以,原码的符号位不能直接参与计算,必须和其他位分开,这样会增加硬件的开销和复杂性。
2.反码正数的反码与原码相同。
负数的反码符号位为1,其余各位为该数绝对值的原码按位取反。
例如,-11的反码是11110100。
同样,对上⾯的加法,使⽤反码的结果是:(00000001)2+(11111110)2=(11111111)2这样的结果是负0。
⽽在⼈们普遍的观念中,0是不分正负的。
反码的符号位可以直接引参与计算,⽽且减法也可以转换为加法计算。
3.补码正数的补码与原码相同。
负数的补码是该数的反码加1,这个加1就是“补”。
例如-11的补码为11110100+1=11110101再次做以上的加法,是这样的:+(11111111)2=(00000000)2(00000001)2这说明,直接使⽤补码进⾏计算的结果是正确的。
对⼀个补码表⽰的数,要计算其原码,只要对它再次求补即可。
由于补码能使符号位与有效值部分⼀起参与运算,从⽽简化了运算规则,同时它也使减法运算转换为加法运算,进⼀步简化计算机中运算器的电路,这使得在⼤部分计算机系统中,数据都使⽤补码表⽰。
4.移码移码⼜称为增码,移码的符号表⽰和补码相反,1表⽰正数,0表⽰负数。
也就是就是说,移码是在补码的基础上把⾸位取反得到的,这样使得移码⾮常适合于阶码的运算,所以移码常⽤于表⽰阶码。
对于正数:原码和反码,补码都是⼀样的,都是正数本⾝。
符号位;原码,反码,补码1 符号位计算机如何存储数据,因为计算机世界⾥⾯所有的数据归根结底都是由0和1来存储的,那么如何表达数值的正负呢?只知道书本上说是有⼀个符号位,当该符号位为0时,表⽰的是正数,为1时表⽰负数。
我那时没搞懂为什么这样规定,我觉得1么,代表正数挺合理的,那么0就⾃然表⽰负数咯,所以不解,只能死记硬背:0正1负。
当代绝⼤多数计算机表⽰浮点数都是采⽤IEEE标准的,这⾥简化⼀下,我们只关⼼符号位,那么对于⼀个数,计算机其实是以下⾯的式⼦来描述它的:(-1)s×X,这⾥的指数s就是⽤来决定数值X是正数还是负数,显⽽易见,当s=0时,则X为正数(因为任何数的0次幂都是1),当s=1时,则X为负数(因为-1的1次幂为-1),⾄此我们就理解了为什么符号位为0时表⽰正数,为1时表⽰负数啦。
2 机器数 ⼀个数在计算机中的⼆进制表⽰形式,叫做这个数的机器数。
机器数是带符号的,在计算机⽤⼀个数的最⾼位存放符号,正数为0,负数为1.⽐如,⼗进制中整数+3,若计算机字长为8位,转换为⼆进制数为 0000 0000 0000 0000 0000 0000 0000 0011;如果是-3,就是1000 0000 0000 0000 0000 0000 0000 0011。
3 真值 因为第⼀位是符号位,所以机器数的形式值就不等于真正的数值。
例如:有符号数的真值如下 1000 0000 0000 0000 0000 0000 0000 0011的真值 = -000 0000 0000 0000 0000 0000 0000 0011 = -3; 0000 0000 0000 0000 0000 0000 0000 0011的真值 = +000 0000 0000 0000 0000 0000 0000 0011 = +34 原码,反码,补码的基础概念和计算⽅法 对于⼀个数,计算机要使⽤⼀定的编码⽅式进⾏存储,原码,反码,补码都是机器存储⼀个具体数字的编码⽅式。
一.带符号数的原码、反码与补码
所谓带符号数,其实就是一个二进制数据,它的最高位所代表的是符号,其余位是其“绝对值”。
例如0101_0011,这个数据如果是带符号数,那么最高位的0就是代表这个数据为正数,其后的101-0011则代表这个数据的绝对值,为+83D。
如果是1101_0011,则代表-83D。
1.1 原码
原码就是按照正数的符号位为0,负数的符号位为1,其他位就是数据的绝对值即可。
例如当机器字长为8bit的二进制数时,它的最高位为符号位,因此其余的7bit位数据的绝对值。
因此原码所能表示的数据范围是:
- (2n-1-1)~+(2n-1-1)
当字长为8bit,则原码能表示的范围就是:-127~+127
例如83的原码就是:0101_0011
当字长为16bit,则原码能表示的范围就是:-32767~+32767
例如-83的原码就是:1000_0000_0101_0011
1.2 反码
对于一个带有符号位的二进制数来说,正数的反码与其原码相同,负数的反码为其原码除符号位外其余各位按位取反。
例如当字长为8bit时,+83D的反码就是:0101_0011,-83D的反码就是1010_1100
负数的反码与原码有很大的差别,一般情况下,反码主要用来当做求二进制数补码的中间形式。
反码所表示的数据范围与原码相同:
- (2n-1-1)~+(2n-1-1)
1.2 补码
正数的补码与其原码相同,负数的补码为其反码在最低位加1。
例如:
X=+101_1011 [X]原码=0101_1011 [X]补码=0101_1011
X=-101_1011 [X]原码=1101_1011 [X]补码=1010_0101
补码表示的范围是:
- 2n-1~+(2n-1-1)
当字长为8bit,则原码能表示的范围就是:-128~+127
当字长为16bit,则原码能表示的范围就是:-32768~+32767
关于0,它有两个补码:
正零:0000_0000
负零:1000_0000
二.通过补码求解原值的方法
1)对于正数,它的原值与补码相同;
2)对于负数,它的原值就是将补码除符号位以外,安位取反之后,末位加1。
例如【X】=0101_1001,由于最高位是0,因此是正数,原值与补码相同,也是0101_1001,转换成10进制就是+89D。
【X】=1101_1010,由于最高位是1,因此原值是负数,符号位外其余各位安位取反为:1010_0101,然后末位加1可得到原值:1010_0110,就是-38D。
三.利用补码进行加减运算
3.1 加法运算
对于加法运算,首先需要计算【X+Y】补,然后再经过补码转原码的方式获得原值。
【X+Y】补=【X】补+【Y】补
例如:X=+011_0011 Y=-010_1001 即:X=+51D, Y=-41D
则【X】原=0011_0011 【X】反=0011_0011 【X】补=0011_0011
【Y】原=1010_1001 【Y】反=1101_0110 【Y】补=1101_0111
因此【X+Y】补=【X】补+【Y】补=0011_0011+1101_0111=0000_1010,再换原码为+10D。
3.2 减法运算
对于减法运算,首先需要计算【X-Y】补,然后再经过补码转原码的方式获得原值。
例如:X=+011_1001 Y=+100_1101 即:X=+57D, Y=+77D
则【X】原=0011_1001 【X】反=0011_1001 【X】补=0011_1001
【-Y】原=1100_1101 【-Y】反=1011_0010 【-Y】补=1011_0011
因此【X-Y】补=【X】补+【-Y】补=0011_1001+1011_0011=1110_1100,将【X-Y】补低7位进行取反,为1001_0011,再将其末位加1,可得【X-Y】原=1001_0100,转换成10进制
的数即为-20D。
由此可知,补码的意义就是可以把所有的加法与减法都转换成加法进行计算,这样非常适用于计算机进行运算处理。
四.关于求补码的深入讨论
通过上面这个表可知,-128如果用8bit的二进制数表示就是1000_0000,“反码+1”的计算方法并不适用-128,所以-128这个数比较特殊,需要特殊记忆。
其实求一个数的补码,按照补码最原始的定义,其实就是正数与原码相同,而负数采用“模减去绝对值”的方法来求,这是求补数的通用方法,适合于各种进制、各种大小数字。
下面就从计算机的角度深入理解补码的概念。
4.1 模与补数的概念
在日常生活当中,可以看到很多这样的事情:
把某物体左转90 度,和右转270 度,在不考虑圈数的条件下,最终的效果是相同的;
把分针倒拨20 分钟,和正拨40 分钟,在不考虑时针的条件下,效果也是相同的;
把数字87,减去25,和加上75,在不考虑百位数的条件下,效果也是相同的;
……。
上述几组数字,有这样的关系:
90 + 270 = 360
20 + 40 = 60
25 + 75 = 100
式中的360、60 和100,就是“模”(也可以理解成“进制”)。
式中的90 和270、20 和40,以及25 和75,就是一对“互补”的数字。
知道了“模”,求某个数字的“补数”,就是轻而易举的了:如果模为365,数字120 的补数为:365 - 120 = 245。
用补数代替原数,可把减法转变为加法。
出现的进位就是模,此时的进位,就应该忽略不计。
4.2 二进制数的模
前面说过的十进制数25 和75,它们是2 位数的运算,模是100,即1 的后面加上2 个0。
如果有3 位数参加运算,模就是1000,即1 的后面加上3 个0。
这里的1000,是十进制数的一千,可以写成10^3,即10 的3 次方。
推论:有多少位数参加运算,模就是在1 的后面加上多少个0。
对于二进制数字,模也是这样推算。
如果是3 位二进制数参加运算,模就是1000,即1的后面加上3个0;
那么当8 位二进制数参加运算,模就是1 0000 0000,即1的后面加上8个0。
注意:这里提到的1、0,都是二进制数。
8 位二进制数的模可以按照十进制写成2^8,即256。
16 位数二进制数的模,就是2^16,按照十进制,它就是65536。
4.3 二进制数的补码
前面说过的十进制数2二进制数的补码,求二进制数的补数,目的是往计算机里面存储。
在计算机里面,存放的数字什么的,都称为机器码;那么二进制形式的补数,也就改称为补码了。
一般情况下,都是以8 位二进制数来讨论补码,少数也有用16 位数的。
计算时加上正数,是不需要进行求取补数的;只有进行减法(或者加上负数),才需要对减数求补数。
补码就是按照这个要求来定义的:正数不变,负数即用模减去绝对值。
已知一个数X,其8 位字长的补码定义为:
(1) 正数:X ; 0 <= X <= +127 (正数和0的补码,就是该数字本身)
(2) 负数:2^8 -|X| ; -128 <= X < 0 (负数的补码,其实就是用1 0000 0000 (2的8次方),减去该数字的绝对值)。
例如X = -126,其补码为1000 0010,计算方法如下:
1 0000 0000
-0111 1110
-----------
1000 0010
可以看出,按照补码的定义来求补码,概念十分清晰,方法、步骤也是十分简单的。
应用补码进行计算
用补码计算:83-25=58。
83 ---都变成补码,再用加法运算--> 0101 0011
-25 -> 1 0000 0000 - 0001 1001-> + 1110 0111
-------------
58 <--忽略进位1,结果就是正确的--> [1]0011 1010
计算结果如果超出了-128~+127的范围,结果将是错误的,这是没有办法纠正的。
应用补码进行计算,完全符合前面介绍的“用补数可把减法转换成加法”的做法,只要忽略进位(这个进位1,就是求补的时候,加进去的1 0000 0000中的1),结果就是正确的。