理论教育 原码、反码、补码的概念与应用

原码、反码、补码的概念与应用

时间:2023-11-19 理论教育 版权反馈
【摘要】:可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值.通常要将其转换成原码再计算。负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1.。

原码、反码、补码的概念与应用

1.机器数

一个数在计算机中的进制表示形式,叫作这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1。比如,十进制中的数+3,计算机字长为8 位,转换成二进制就是00000011。如果是-3,就是10000011。那么,这里的00000011 和10000011 就是机器数。

2.真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1 代表负,其真正数值是-3 而不是形式值131(10000011 转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例如:0000 0001 的真值=+000 0001=+1,1000 0001 的真值=–000 0001=–1。

3.原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。在我们的认知领域里,数字电路中的用逻辑电路输出高、低电平表示二进制数1 和0,然而数值一般分为正数和负数,当然在进制这里也不例外,以二进制为例,在二进制数最前面加上一位二进制数,其中1 就是代表的负数,表明这个数值是一个负的,0 就是代表的正数,表明这个数值是一个正值。

通过这个例子你可以看到,对于一个二进制来说,最高位就是符号位,1 就是代表的负数,0 就是代表的正数。那么我们就可以算出一个8 位的二进制数它能表达的取值范围就应该是[11111111,01111111];即[-127,127];当然这个对于学过C 语言的同学就知道,一个char 类型,占一个字节,也就是8 位二进制,给出的取值范围是[-128,127];那这两个为什么不一样?

拓展延伸:请问在计算机中是否是用原码来存储数据呢?

验证:1-1=?

按照我们正常正确的思维来计算的话,那么结果毋庸置疑的是0.那么我们就来算算。

1-1=1+(-1)

也就是说:

这个结果是不是和我们的思维相违背,所以得出结论是用原码存储数据不对。

4.反码

反码顾名思义就是反着来,当然,这里需要注意一点就是:

正数的原码、反码是一样的。

负数的反码就是符号位不变,其他位在原码的基础上取反,即0 变为1,1 变为0。

可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值.通常要将其转换成原码再计算。

拓展延伸:请问在计算机中是否是用反码来存储数据呢?(www.daowen.com)

验证:计算1-1=?

1-1=1+(-1)

也就是说:

然而,+0 的反码是 0000 0000;

-0 的反码是1111 1111 取反得到1000 0000。

那么这里就出现了一个问题:在计算机中对于0 这个数存在了两种格式,然而在我们的认知领域里,0 就是0,只有一种表达形式,然而如果计算机用反码的形式存储就不能解决+0 和-0 以及0 的问题。所以得出结论,计算机存储不能用反码的形式存储。

5.补码

补码的表示方法是:

正数的原码、反码、补码就是其本身。

负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1.(即在反码的基础上+1)。

例如:

在最后一行中,-0 的补码得出来是一个9 位的二进制数,由于我们测试的是8 位,所以,应该把最高位舍去,有读者会问我,为什么舍去高位,不舍去低位,那是因为数据在存储的时候是由高到低进行一个存储。所以-0 的补码应该是0000 0000。

拓展延伸:请问在计算机中是否是用补码来存储数据呢?

验证:计算1-1=1+(-1)

得出的结果就是0,而且从上面例子我们也可以清楚地看到+0 和-0 这两个存储的结果都是一样的,即0000 0000,所以,如果用补码的形式存储就把一切问题都解决了。

结论:在计算机存储数据时,计算机是采用二进制补码的形式进行存储。

这里给大家一个很好的例子,通过代码的形式来展示:

输出结果:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈