各种数值在计算机中表示的形式为机器数,其特点是采用二进制计数制,数的符号用0或1表示,小数点则隐含,表示不占位置,这就是机器数的原码。为了便于运算,带符号的机器数可采用原码、反码、补码和移码等不同的编码方法,机器数的这些编码方法称为码制。在这种表示方法中,最高为是符号位,0表示正号,1表示负号。
原码就能够表示一个二进制数了,为什么要使用不同的编码方法(反码,补码)?
有了数值的表示方法就可以对数值进行算数运算。
下面,我们先区分一下机器数和真值:
机器数:一个数在计算机中的二进制表示形式,如00001。
真值:除符号位,一个二进制数所表示的值。0000 0001的真值=+0000 0001=+1;1000 0001的真值=-0000 0001=-1而不是129
根据运算法则,减去一个正数等于加上一个负数,即1-1=1+(-1)=0
(1)10 = (1)10 + (-1)10 = (0)10=0
十进制的1减十进制的1等于十进制的1加十进制的-1等于十进制的0,也就是0
原码:
(0000 0001)原+(1000 0001)原 = (1000 0010)原 = (-2) 与上面计算结果不同
当用原码计算时,让符号位也参与运算,显然,结果是错误的。
反码:
(0000 0001) 反+(1111 1110)反 = (1111 1111)反 = (1000 0000)原=(-0) 与上面j计算结果不同
我们发现,当用反码计算时,结果的真值部分是正确的,但是出现了-0的情况,在人们的意识里,+0和-0是一样的,但是0带符号是没有意义的,还会出现(0000 0000)和(1000 0000)两种表示方式。
因此,反码解决了负数加法运算的问题,将减法运算转换为加法运算,从而简化运算规则。
补码:
(0000 0001)补+(1111 1111)补=(0000 0000)补=(0000 0000)原=0与上面计算结果相同
使用补码, 修复了0的符号以及存在两个表示0的编码的问题,弥补了反码的不足。
移码:
移码是符号位取反的补码,一般用zhi'指数的移码减去1来做浮点数的阶码,引入的目的是为了保证浮点数的机器零全为0(小编表示完全不知道这是说了点啥,有明白的大神可以在评论中多多指教哦!)
原码、反码、补码和移码存在的差别?
我们以十进制数+45和-45,机器字长为8举例:
+45 -45
原码00101101 10101101
正数原码=其二进制数 负数原码=其二进制数符号位取反
反码00101101 11010010
正数反码=原码 负数反码=原码除符号位均取反
补码00101101 11010011
正数补码=原码 负数补码=反码+1
移码00101101 01010011
正数移码=原码 负数补码=补码符号位取反
总结:
1.正数的原码、补码、反码、移码均为其二进制数
2.负数的原码、反码、补码、移码转换公式:
反码=原码(除符号位外)均取反
补码=反码+1
反码=补码-1
移码=补码符号位取反
当时软考学习这部分内容的时候,只考虑了原码、反码、补码、移码之间的相互转化,没想过为什么要有这么多的编码方式,今天查了下资料,花了一下午的时间研究,有了一点点成果。没有无缘无故存在的事物,任何东西存在都是有他的价值的,懂得了这些,以后在学习其他东西的时候也可以问一问自己,为什么要有这个东西呢?不能为了学习而学习,而是有自己的思考,这样我们将会学到更多的知识。