比如128 到-128
1000 0000原
1111 1111 反
1000 0000补
原码反码补码都有什么作用?
一、原码、反码、补码 都是什么意思
注意:如果源码是正数,原码,反码,补码,都是他本身
(下方是为了方便理解才这样写的)
原码:将一个任意进制数转换为二进制数,就是原码
比如: 10(10)->1010(2)
其中1010就是源码
反码:就是原码各位取反
比如:1010(2)各位取反变成 0101(2)就是反码
补码:就是反码+1
比如上面的0101(2)+1=0110(2) ,得到的0110就是补码
你现在已经了解了原,反,补码的概念
接下来我们了解原,反,补码怎么运行的
用1个字节(8比特)表示
两个十进制数 15 和 -15
源码
100(10)=00001111(2)
-100(10)=10001111(2)
其中最高位是符号位
这时候数8位bit的表示范围是
11111111~011111111
就是-127~+127
最高位是符号位,1表示负,表示正
反码
借用上面的数据
100(10)=00001111(2)
-100(10)=10001111(2)
取反之后
100(10)=00001111(2)->00001111
正数不变
-100(10)=10001111(2)->11110000
负数除符号位各位取反
这时候数8位bit的表示范围是
01111111~111111111
就是+127~-127
最高位是符号位,1表示负,表示正
我们发现
10000000(2)和00000000(2)
都表示0,那么的话就会浪费一个表示数值
那么就引进补码的概念
同样正数不变,负数补码是反码+1
100(10)=00001111(2)->00001111->00001111
正数不变
-100(10)=10001111(2)->11110000->11110001
负数的补码是反码+1
这时候数8位bit的表示范围是
01111111~10000000
就是+127~-128
其中10000000(2)也就是原来的-0把它表示为-128
引入补码的还有一个原因
它可以将减法转换为加法
比如
14->补码->00001110
-15->补码->11110001
相加
14+(-15)=00001110+11110001
按位相加
00001110
11110001
-------------------
11111111
就得到-1
验证一下:
十进制数:-1
原码->10000001
反->11111110->
补->11111111
也是学生一枚,如果有什么不好的地方请批判指正谢谢
一、什么是原码、反码、补码
原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为: 0000 0101; -5的原码为10000101。
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每-位取反。
如单字节的5的反码为: 0000 0101; -5的反码为1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节的5的补码为: 0000 0101; -5的补码为1111 1011。
二、为什么要有这三类码
计算机只能识别0和1,使用的是二进制。而在日常生活中人们使用的是十进制,并且我们用的数值有正负之分。于是在计算机中就用一个数
的最高位存放符号(0为正,1为负)。这就是机器数的原码了。
有了数值的表示方法就可以对数进行算术运算,但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了
问题,如下:假设字长为8bits
(1) 10- (1)10=(1)10+ (-1)10= (0)10
(00000001)原+ (1 0000001)原= (1 0000010)原=(-2)显然不正确。
因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上。对除符号位外的其余各位逐位取反就产生了反
码。反码的取值空间和原码相同且- -- 对应。下面是反码的减法运算:
(1)10-(1)10= (1)10 + (-1)10= (0)10
(0 0000001)反+(1 1111110)反=(1 1111111)反=(-0)有问题。
(1)10- (2)10= (1)10 + (-2)10= (-1)10
(00000001)反+(1 1111101)反=(11111110)反=(-1)正确。
问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的。(印度 人首先将零作为标记并放入运算之中,包含有零号的印度数学和
十进制计数对人类文明的贡献极大)。
于是就引入了补码概念。负数的补码就是对反码加一,而正数的补码不变,正数的原码反码补码是-样的。在补码中用(-128)代替了(-0),这
个是人为规定的,所以补码的表示范围为:
(-1280127)共256个。
注意: (-128)没有相对应的原码和反码,(-128)= (1 0000000)补码的加减运算如下:
(1)10- (1)10= (1)10+ (-1)10 = (0)10
(0 000001)补+(1 111111)补= (0 000000)补=(0)正确。
(1)10- (2)10= (1)10 + (-2)10=(-1)10
(00000001)补+ (1111110)补= (1111111)补=(-1)正确。
所以补码的设计目的是:
(1)使符号位能与有效值部分-起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,
可以正常地参与运算。
(2)使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。