二进制正,负数的原码,反码,补码三者之间是什么关系?
(1)原码表示法:一个机器数x由符号位和有效数值两部分组成,设符号位为x0,x真值的绝对值|x|=x1x2x3...xn,则x的机器数原码可表示为:
[x]原=
,当x>=0时,x0=0,当x<0时,x0=1。
例如:已知:x1=-1011B,x2=
+1001B,则x1,x2有原码分别是
[x1]
原=11011B,[x2]原=01001B
规律:正数的原码是它本身,负数的原码是取绝对值后,在最高位(左端)补“1”。
(2)反码表示法:一个负数的原码符号位不变,其余各位按位取反就是机器数的反码表示法。正数的反码与原码相同。
按位取反的意思是该位上是1的,就变成0,该位上是0的就变成1。即1=0,0=1
(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是真值,则补码的定义如下:
例:设字长n=8位,x=-1011011B,求[x]补。
解:因为
n=8,所以模
M=28=100000000B,x<0,所以
[x]补=M+x=100000000B-1011011B=10100101B
注意:这个x的补码的最高位是“1”,表明它是一个负数。对于二进制数还有一种更加简单的方法由原码求出补码:
(1)正数的补码表示与原码相同;
(2)负数的补码是将原码符号位保持“1”之后,其余各位按位取反,末位再加1便得到补码,即取其原码的反码再加“1”:[x]补=[x]反+1。
下表列出
的8位二进制原码,反码和补码并将补码用十六进制表示。
真值
原码(B)
反码(B)
补码(B)
补码(H)
+127
0
111
1111
0
111
1111
0
111
1111
7F
+39
0
010
0111
0
010
0111
0
010
0111
27
+0
0
000
0000
0
000
0000
0
000
0000
00
-0
1
000
0000
1
111
1111
0
000
0000
00
-39
1
010
0111
1
101
1000
1
101
1001
D9
-127
1
111
1111
1
000
0000
1
000
0001
81
-128
无法表示
无法表示
1
000
0000
80
从上可看出,真值+0和-0的补码表示是一致的,但在原码和反码表示中具有不同形式。8位补码机器数可以表示-128,但不存在+128的补码与之对应,由此可知,8位二进制补码能表示数的范围是-128——+127。还要注意,不存在-128的8位原码和反码形式。
(1)正数的补码表示与原码相同;
(2)负数的补码是将原码符号位保持“1”之后,其余各位按位取反,末位再加1便得到补码,即取其原码的反码再加“1”:[x]补=[x]反+1。;
(3)列出 的8位二进制原码,反码和补码并将补码用十六进制表示。
内容拓展:
一、二进制
1、是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。
2、当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。
二、在计算机中,数的正负号是用0,1表示。
三、真值为正时。其原码,反码,补码完全相同。
四、 真值为负时,其原码就是把负号改为1,其余不变。反码就是负号改为1,其余取反。
五、补码就是在反码的基础上加1,加1时记得是逢2进1。
带符号数,有三种表示方法,即:原码、反码和补码。
但是,在计算机系统中,数值一律用【补码】来表示和存储。
所以,在计算机系统中,原码和反码,都是不存在的。
使用补码的意义:可以把减法或负数,转换为加法运算。
因此,就能简化计算机的硬件。
=====================
补码的概念,来自于:补数。
比如钟表,时针转一圈,周期是 12 小时。
那么,倒拨 3 小时,可以用正拨 9 小时代替。
9,就是-3 的补数。 计算方法: 9 = 12-3。
同理,分针倒拨 X 分,可以用正拨(60-X) 代替。
60,是分针的周期。
上过中学的同学,都知道,三角函数的周期是 2π。
那么,在-π/2 和 +3π/2 这两处的函数值是相同的,可互换。
算法是: +3π/2 = 2π - π/2。
------------
如果你使用两位十进制数:0~99,周期就是 一百。
那么,减一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
舍弃进位,这两种算法,功能就是相同的。
于是,99 就是 -1 的补数。
计算: 补数 = 周期 + 负数
对于其它负数,自己去求补数吧。
------------
计算机中使用二进制,补数,就改称为【补码】。
八位二进制是:0000 0000~1111 1111。
相当于十进制:0~255, 周期就是 256。
那么,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的补码,就是 1111 1111 = 255。
同理:-2 的补码,就是 1111 1110 = 254。
继续:-3 的补码,就是 1111 1101 = 253。
。。。
最后:-128 的补码,就是 1000 0000 = 128。
负数补码的计算公式:【 256 + 这个负数 】。
(式中的 256 = 2^8,是八位二进制的周期。)
正数,并不存在补码的问题。
所以,正数,并没有补码,可以直接运算。
(也有人概念不清,就乱说:正数本身就是补码。)
------------
求解算式: 7-3 = 4。
计算机中,并没有减法器,必须改用补码相加。
列竖式如下:
7 的补码=0000 0111
-3的补码=1111 1101
--相加-------------
得: (1) 0000 0100 = 4 的补码
舍弃进位,只保留八位,结果完全正确。
------------
借助于补码,可以简化计算机的硬件。
原码和反码,都没有这种功能。
在计算机中,根本就没有原码和反码。
它们都是什么? 就不用关心了。
在计算机中,借助于补码,那么,负数和减法,都可以转化成加法来进行运算。
使用这种方法的目的就是:简化计算机的硬件。
在计算机中,只有补码,并没有原码和反码。
补码和负数,有一一对应的关系,可以直接转换,并不需要通过原码反码。
那么,“原码反码取反加一”这些,都是垃圾知识,都是无用的。
-------------------------
计算机中所能计算的位数,是固定的,如八位机、16、32、64 位机。
位数限定之后,减去某个数,就可以用加上其补数,来完成。
如在两位十进制中,减一,就可以用 +99 代替。
25 - 1 = 24
25 + 99 = (一百) 24
舍弃进位一百,只取两位,这两个算法,结果就是相同的。
一百,就是两位十进制的计数周期:10^2。
99,就是-1 的补数。 求解公式: 补数 = 周期+负数。
上过中学的同学,都知道,三角函数的周期是:2π。
在-π/2 的函数值,与 +3π/2 ( =2π-π/2 ) 处相同。
那么,-π/2,就可以用 +3π/2 来代替。
懂了这些,也就懂了补码。
补码,原理很简单!扯出原码反码,只能说是故弄玄虚而已。
-------------------------
计算机用二进制,补数,就改称:补码。
八位二进制是 0000 0000 ~ 1111 1111(十进制255)。
其计数周期是:2^8 = 256。
那么,[-1]补 = 256-1 = 255 = 1111 1111(二进制)。
如用“原码反码取反加一”来做,也是这个结果。
求负数八位补码的通用计算公式: 补码 = 256 + 负数。
-------------------------
在八位补码中,用 128~255 代表 128 个负数-128~-1。
而 0~127,这就是本来的正数,不需要任何转换。
有人说“正数的原码反码补码,都相同”,其实,这是误导。
正数,其补码都不存在,更别说计算机中不存在的原码反码了。
-------------------------
借助于补码,负数和减法,都可以转化成加法来进行运算。
那么,计算机的硬件,就可以简化了。
因此,计算机只有加法器,并没有减法器。
负数的反码等于原码按位取反,补码等于反码加1。