计算机中的原码、补码、反码

发布时间 2023-08-19 15:12:09作者: limalove

参考:深入理解计算机中的原码、补码、反码 - 知乎 (zhihu.com)

计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。

  • 机器数:一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数。
  • 机器数的真值:因为带有符号位,所以机器数的形式值不等于其真值,以机器数1000 0111为例,其真正表示的值为-7,而形式值为135。将带符号的机器数的真正表示的值称为机器数的真值。

 

正数的原码、反码、补码一致。

负数:反码在原码的基础上,符号位不变,其余各位取反。补码:反码基础上+1.

 

 

问题:为何使用原码、反码、补码

我们上面说过,原码、反码、补码的表示对于正数来说都是一样的,而对于负数来说,三种码的表示确是完全不同的,那大家是否会有个疑问:如果原码才是我们人类可以识别并用于直接计算的表示方式,那为什么还会有反码和补码?计算机直接存储原码不就完事了?

在解决这些问题前,我们先来了解计算机的底层概念,我们人脑可以很轻松的知道机器数的第一位是符号位,但对于计算机基础电路设计来说判别第一位是符号位是非常难和复杂的事情,为了让计算机底层设计更加简单,人们开始探索将符号位参与运算,并且采用只保留加法的方法,我们知道减去一个数,等于加上这个数的负数,即:1-1 = 1 + (-1) = 0,这样让计算机运算就更加简单了,并且也让符号位参与到运算中去。

 

注意:因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示,只要补码是[1000 0000],其十进制数值就为-128。


因为补码能多存储一个-128,而且在计算机底层中存储的是补码,所以在计算机中一个8位的二进制数的存储范围是用补码表示的[-128,127],而不是用原码或反码表示的[-127,127]。这也可以解释为什么计算机中一个字节的取值范围是[-128,127]。

这样也能够回答我们开始提出的问题了,原码、反码、补码的使用,是人们为了让符号位能参与运算并让计算机底层运算更加简单而设计出来的数据存储表示方式。

 

参考2:

-128 在八位二进制下,并没有原码和反码,只有补码。

而且,在计算机中,也只有补码,并没有原码和反码。

使用补码的意义在于:【把减法转换为加法】。

从而能够简化计算机的硬件。

计算机的位数是固定的,这就为补码的应用,提供了条件。

在八位二进制下,因为有一位是符号位,原码和反码只能表示0到127,-0到-127,所以-128不能用原码或反码表示。

 

反码通常是用来由原码求补码或者由补码求原码的过渡码。

原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值

在计算机内,有符号数有3种表示法:原码、反码和补码

 

补码同余

 

好多知识啊,以后研究下