搜索
写经验 领红包

原码反码补码区别(原码反码补码的作用)

导语:聊聊原码、反码和补码那些事

原码反码补码区别(原码,反码,补码的作用)

众所周知,数据在计算机中进行存储,是采用了一定的编码的。数据在计算机中可以用原码、反码和补码进行表示。不过在开始介绍原码、反码和补码之前,我需要先介绍两个概念:机器数和真值。

机器数和真值机器数

所谓机器数就是一个数字在计算机中用二进制表示的形式。机器数是带符号位,符号位为最高位,0表示正,1表示负。

例如:+进制数+3,其转换为二进制数后为:0000 0011,而对于十进制数-3,其转换为二进制数后为:1000 0011。这里的0000 0011和1000 0011就是所谓的机器数。

真值

所谓真值就是机器数所表示的真正的数值。因为机器数是包含符号位,所以转换后的二进制成为形式值。

例如:1000 0001的形式值为129,但是其真正的数值为-1。所以,计算真值的时候,符号位仅仅用来表示该数值是正还是负,而无需参与数值的计算。

原码、反码和补码的概念

首先,计算机存储一个数是需要遵循一定的规则的,也就是所谓的编码。而原码、反码和补码就是计算机存储数字的不同的编码方式。

原码

所谓原码就是不对机器数进行任何的转换。其真值就是符号位加剩余位数计算得出的数。

例如:+1的原码是:0000 0001,-1的原码是1000 0001。

对于原码来说,由于第一位被用作了符号位,因此一个8位的二进制数,其表示范围是[-127,127]。

至于转换规则也很简单,对于正数来说,其转换后得到的二进制数就是其原码。对于负数来说,只需将转换后的二进制数的最高位变为1即可。

反码

所谓反码就是,如果该数为正数,则无需进行任何转换,如果该数是负数,则符号位保持不变,其余位取反。

例如:+1的反码是:0000 0001,-1的反码是1111 1110。

对于反码来说,与原码类似,由于首位被用作了符号位,因此表示范围也是[-127,127]。

从上述例子可以看出,若一个数为负数的时候,使用反码表示法无法直接得出该反码所表示的真正的数值,需转换为原码后再进行计算。

反码转换为原码的方式是:符号位保持不变,其余位按位取反。

补码

所谓补码就是,如果该数为正数,则无需进行任何转换,如果该数是负数,则符号位保持不变,其余位按位取反后加1,也就是先得到该数的反码后加1。

例如:+1的补码是:0000 0001, -1的补码是:1111 1111。

对于补码来说,虽然最高位也被用作了符号位,但是却可以表示-128,因此其取值范围是:[-128, 127]。

同样的,若一个数为负数,使用补码方式也无法直接得出该补码所表示的真正的数值,也需要转换为原码后再进行计算。

补码转为原码的方式是:先将补码减1后,符号位保持不变,其余位按位取反。

为何要使用反码和补码

通过上面的介绍,大家发现了一个问题,原码是对人最好的一种编码,那么为何还要出现反码和补码呢?

首先,一个数值存入计算机后不仅仅是用来展示,还需要参与各种计算。如果是我们人来计算,则能很容易先将符号位进行隔离,先计算除符号位之外的剩余位后再加入符号位。但是,对于计算机来说,则比较困难。最好的方法是让符号位也参与运算。这样类似1-1的问题就转换为了1+(-1)的问题,也就是将减法转换为了加法。

但是想法是好的,但是现实是残酷的。用原码来进行计算的时候总是无法得出正确的值。

当使用原码进行计算的时候,例如:1 - 1 = 1 + (-1)= (0000 0001) + (1000 0001) = 1000 0010 = -2。

所以为了解决减法计算的问题,出现了反码。

当使用反码进行计算的时候,例如:1 - 1 = 1 + (-1)= (0000 0001) + (1111 1110) = 1111 11111

此时的1111 1111为反码表示形式,转换为原码为1000 0000,也就是-0。

虽然在我们的认知中,+0和-0都是0,但是对计算机而言,用两个二进制数值来表示0则显得有些不太合适。所以,用反码表示数值也并非尽善尽美。

所以为了解决+0和-0的表示问题,出现了补码。

当使用补码进行计算的时候,例如:1 - 1 = 1 + (-1) = (0000 0001) + (1111 1111)= (1)0000 0000 。由于超出了表示位数,本该存在的最高位的1会丢掉,所以得出的结果为:0000 0000。

此时的0000 0000为补码,转换为原码后为0000 0000,其值为0,符合预期结果。

再例如:-1 - 127 = (-1) + (-127)= (1111 1111) + (1000 0001)= (1)1000 0000。同理,最高位1会发生丢失,所以得出的结果为:1000 0000。

此时的1000 0000为补码,恰好可以呀用来表示-128.不过需要强调的是,正因为用补码表示的-128转换后得到原码为-0,所以-128只有补码的表示形式。

自此,关于原码、反码和补码的介绍就已经完毕了,希望大家都能掌握。

本文内容由快快网络小岑整理编辑!