浅谈原码 反码 补码

来源:互联网 发布:ugg和jumbougg知乎 编辑:程序博客网 时间:2024/06/08 08:44

在了解原码、反码、补码之前,我们首先需要知道的是什么是机器数?什么是真值?

机器数:机器数(computer number)是将符号”数字化”的数,是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。

真值:真值是一个变量本身所具有的真实值,它是一个理想的概念,一般是无法得到的。所以在计算误差时,一般用约定真值或相对真值来代替。

1.原码
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

[+1]原 = 0000 0001
[-1]原 = 1000 0001

2.反码
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作:0变1,1变0

[+1]原 = [0000 0001]原 = [0000 00001]反
[-1]反 = [1000 0001]原 = [1111 1110]反

正数的原码为其本身;负数的反码是在其原码的基础上,符号位不变,其余各位取反;

3.补码

[+1]原 = [0000 0001]原 = [0000 00001]反 = [0000 0001]补
[-1]反 = [1000 0001]原 = [1111 1110]反 = [1111 1111]补

正数的补码为其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(也可理解为:负数的补码是在其反码的基础上+1);

根据以上的分析,我们可以知道,正数的原码、反码、补码三种编码方式都是相同的,即:

[+1]原 = [0000 0001]原 = [0000 00001]反 = [0000 0001]补

因此,我们主要需要探讨的还是负数的编码方式,现在我们可以看一个减法的小例子:
计算十进制的表达式:1 - 1 = 0
我们可以试着用原码进行计算,即:

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2

为什么会出现这样的结果呢?我们可以思考一下,如果用原码表示减法运算,并且让符号位也参与运算,显然结果是不正确的。
我们试着用反码进行计算,即:

1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

根据上面的计算结果,我们可以知道,真值的部分其真值部分是正确的,但是“0”确是有歧义的,我们平时理解的+0和-0是一样的,但是用原码却是[0000 0000]原和[1000 0000]原两种编码方式表示0。
既然出现了问题,我们可以先思考一下为什么会出现这样的问题呢?其次,我们可以在试试用补码表示,即:

1 - 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = [1111 1110]补 = [0000 0000]补 = [0000 0000]补 = 0

现在,我们可以看到,前面-0的问题不存在了吧。
根据以上的分析可知:为什么会出现原码、反码和补码,而不仅仅是只有原码了吧。

既然已经说到这块了,那后面再说一点点和它相关的内容。
为什么8位二进制表示原码的范围是[-127,+127],但表示补码的范围却是[-128,+127]吗?
下面我们可以看一个小例子就可以很好的解释这一问题了:

(-1) + (-127) = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

在补码的运算结果中,[1000 0000]补的值为-128,但是在实际中,使用以前-0的补码来表示-128,所以-128并没有原码和反码表示。(根据上面的计算方法,我们可以得出-128的补码表示[1000 0000]补算出来的原码为[0000 0000] ,切记:这是不正确的,错的,不对的!!!)

原创粉丝点击