以一般人逻辑理解数值的编码:原码,补码,真值

前言

1.虽然现在计算机有64位,但是为了简单,本文介绍时以8位为例进行说明。
2.为了充分理清逻辑,本文放弃分类讨论。

原理

规定符号位

现在有8个二进制位,可以产生2的8次方种组态。为了存储负数,将最高位拿出来,用0来表示正,1来表示负。那么0000 0000到0111 1111表示正数,1000 0000到1111 1111来存储负数。那么产生一个问题?第一个负数用什么来表示?

从第一个负数的编码说起

正确的逻辑是0000 0000B表示数字0,那么
0-1=0000 0000B -1B=1111 1111B
(你可能要说这不相等,因为
1 0000 0000B -1B=1111 1111B
我的解释是我只有8位,不管这个数值实际是多少位的,可能是
1 0000 0000-1,11 0000 0000-1,
只要能借到位,对于我所拥有的8位就会是
1111 1111.
为了顾及它们的情况,所以
0000 0000B -1B=1111 1111B)
接下来的编码就简单了,
-1-1=1111 11111B-1B =1111 1110B
-1-2=1111 1111B -10B=1111 1101B

-128=1000 0000
这样所有8位二进制的组态都编码完了。
以一般人逻辑理解数值的编码:原码,补码,真值

如何求真值

对于正数,其补码对应的十进制数就是真值。对于负数,补码真值的绝对值为该负数到0的距离,对这个绝对值取负就是真值。如果还不明白,不妨看看下面的两个问题

为什么负数的补码是对应正数取反再加一

十进制数正数的绝对值代表该正数到0点的距离,负数的绝对值代表该负数到0的距离。
那么对一个8位二进制数
正数的绝对值表示该正数到0000 0000B 的距离
如:0000 0001B到0000 0000B的距离为1B;
         \,\,\,\,\,\,\,\, 0000 0010B到0000 0000B的距离为10B;
由于0000 0000 取反后为1111 1111,所以负数补码的示数表示补码到1111 1111的距离。如:
1111 1110B到1111 1111的距离为1B(距离为1);
1111 1101B到1111 1111的距离为10B(距离为2);
(可以用1111 1111B-1111 1110B算出来1,也可以用
低有效,0为真的想法来算出来1,1111 1110如果以0为真对应数字1,
1111 1101如果0为真对应数字2)

(有些时候换一种说法就可以缩短逻辑链,这是在学数电的时候用到的方法,替换1,真,高电平。说明一下希望能给读者启发)

再右移一位就得到补码
以一般人逻辑理解数值的编码:原码,补码,真值

如何根据补码看出真值?根据真值看补码?

1.求1111 1101B的真值,负数0为真,对应数字2,那么距离-1为2,它的真值为-3.
2.求-3的补码。
-1=1111 1111B
-1-2=1111 1111B-10B=1111 1101B