您的位置:首页 > 其它

原码、反码、补码与移码

2018-03-20 17:57 1061 查看
这篇博客本来是打算上周五就写的,结果上周五又有其他安排,就在今天写了。

大家都知道,在计算机中都是以0和1来传递信息的,所以我们将各种数值在计算机中表示的形式称为机器数,特点就是采用二进制计数制。那么为了便于计算,机器数又可以采用原码、反码、补码与移码等不同的编码方法,而这种编码方法称为码制。

这篇文章,就尝试将这种码制解释一下。在开始之前,首先达成一个共识,在表示方法中,最高位是符号位,0表示正号,1表示负号。如果机器字长为n,则表示用n个二进制位表示数据。是不是有点儿绕?说白了就是规定机器字长为n,那就是n个数字。在这里,n取为8。好了,接下来进入正题

1,原码:

在原码中,除了最高位是符号位之外,其余都表示数值的绝对值。举个栗子:1的原码为0 0000001,-1的原码为1 0000001(最高位也就是第一个数字,是符号位)

在这里,如果对1+(-1)进行运算,那么应该为0。但是如果以原码进行计算,我们发现结果为1 0000010,转换为十进制则为-2。与实际相比,误差较大。所以还需要别的编码规则,比如反码。

2,反码:

对于正数来说,反码与原码是相同的。

但是对于负数来说,反码与原码,除了最高位不变之外,其余位取反(毕竟是反码反码,怎么体现呢?就是通过其余位取反来体现的)。比较难以理解对吧,咱们拿-1来举例,-1的原码为1 0000001,那么-1的反码就是1 1111110。这样是不是就好容易理解一些~

同样,如果将1的反码与-1的反码进行运算,我们发现结果为1 1111111,将反码弄为原码为0 0000000,也就是十进制中的0,是不是误差较原码相比,就小一些。

3,补码:

正数的补码与原码相同。

对于负数来说,补码就是在反码基础上,末尾加1。同样举个例子,通过上面我们知道,-1的反码为1 1111110,那么在末尾加1之后,则变为1 1111111,那么8个1就是-1的补码。

同样,如果将1的补码与-1的补码进行运算,结果为0 0000000。结果直接就为0,不像反码那样,还需要再转换一下。

基于此,补码是应用较为广泛的。

4,移码:

对于移码,我感觉我的理解也是有些偏差。先写在这里,哪里有误,还望指出~

移码就是在数X上增加一个偏移量来定义。对于在偏移2的n-1次方的情况下,只需要将补码的符号位取反就可以获得相应的移码。

拿1与-1举例,1的补码是0 0000001,那么它的移码就是,1 0000001。-1的补码是1 1111111,那么它的移码就是0 1111111。

到这里,原码、反码、补码与移码就介绍完毕了。

综上所述,正数的原码,反码,补码都是一样的,所以正数是不太难理解的。

对于负数,反码是在原码基础上,除了符号位不变,其余位都取反,而补码就是在反码基础上,末尾加1。

对于移码来说,在偏移2的n-1次方的情况下,只需要将补码的符号位取反就可以获得相应的移码。

特别的,在原码中0有两种表示方式:[+0]原=0000000,[-0]原=1000000。

在反码表示中,0也有两种表示形式:[+0]反=0000000,[-0]反=11111111。

在补码表示中,0有唯一的编码:[+0]补=0000000,[-0]补=0000000。

以上都是基于我浅浅的理解写的一篇文章,错误之处,还望指正。

感谢您的阅读~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: