学习笔记-原码、反码和补码

计算机中的数都是以二进制补码的形式存储的,因此理解原码反码和补码的转换尤为重要,此笔记为本人学习的一个记录,一是为了加深印象,二是为了与大家分享。若有不足之处,希望能在评论区帮忙指正,愿读者看完后能有所收获。


首先要明确的是,讨论原码、反码、补码都是建立在有符号数的基础上的,无符号数讨论这些没有意义。

注意要区分的是某码(某可以是:原、反、补)和真值。比如:

-10010010  |  10001101
+10010010  |  10100010

左边都都是真值,右边的叫做某码(在这里先把真值与各种码区分开就行了)。
正数的原码、反码、补码都是正数本身,比如 +6 ,在八位二进制数表示下:

原码 0000 0110
反码 0000 0110
补码 0000 0110

负数的原码、反码、补码就不一样了

  1. 原码:最高位为符号位,剩余位表示负数的值
  2. 反码:将原码的符号位不变,其余位取反,即可求得反码
  3. 补码:反码加 1 即是补码
    对于大部分数字,按照此操作求其原码、反码、补码都可以很顺利,但是有些数字求补码的时候会很疑惑,比如在 8 位二进制表示下 -128的补码,在这里读者可以试着求一下,答案是 1000 0000.

为了解决疑惑,在这里着重讲一下补码
首先要知道补码为什么诞生,因为计算机内部只有加法器(这句话我不太确定是否正确),但是计算过程中会涉及到减法,我们希望通过加法实现减法,即一个数 A,减去一个数 B 的结果,可以用一个数 C 与 A的和表示,即想达到 A - B = A + C,这里的 C 就是 B 的补码。

接下来讲为什么可以用 A + C 表示,这里就要了解另一个概念了——溢出。比如在八位二进制数的加法中 1111 1111 + 0000 0010,结果应该是 1 0000 0001,但是计算机只能存储 8 个二进制数,第一个 1 在计算机中就被简单的舍去了,即 1111 1111 + 0000 0010 = 0000 0001,一个大数加一个数,结果却比大数要小。看图片
image

现在计算 8 - 6,结果一眼就看出 8 - 6 = 2,如何用加法实现这个呢?如图
image

到了这里再讲一种求补码的方式,补码 = 模数 - 其正值的原码,就拿-6为例(8位二进制下),其正值对应的原码为 0000 0110, 8位二进制能表256个数,所以模数就是 256,即 1 0000 0000,可以拆分成1111 1111 + 0000 0001,计算过程可以先拿 1111 1111 - 0000 0110 再加 0000 0001,这算下来不就是按位取反再末尾加 1 吗?不是跟公式一样吗?,确实是一样的,但是求解的步骤不一样,现在你再去求一下 8 位二进制下的 -128 的补码,会发现很容易理解为什么是 1000 0000。

tip: n 位二进制的模数为 \(2^n\)

还有一种码叫做移码,比如 8 位二进制能表示的有符号数范围为 -128-127,按从小到大一次分配二进制数,产生的码叫移码

-128  |  0000 0000
-127  |  0000 0001
-126  |  0000 0010
... ...
126   |  1111 1110
127   |  1111 1111

移码具有能直观比较出大小的特点,它与其对应补码的不同是最高位刚好相反。

最后再说一下,若求补码,要先确定数字的位数,相同的数,在不同位数下表示出补码的结果不同,但有一定规律,请读者自己发现吧,在这里举一个例子:-128在8位二进制下的补码是 1000 0000,16位下是
1111 1111 1000 0000.

如有误,请帮忙指正,谢谢!

posted @ 2022-03-07 21:13  伍六柒-  阅读(214)  评论(0编辑  收藏  举报