这篇文章上次修改于 1500 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

原码、反码、补码是什么

先说个不靠谱的小故事

数字最早被我们在自然界抽象出来的时候本没有正负之分,比如一个人,两个人,三个人。没有负一个人之说

那么在计算机表示数字的时候也是没有正负之分,现在我们假设计算机是用 1 字节也就是 8 bit 来存储数据,那么数字 1、2 再计算机中如何表示呢

//无符号
1 -> 0000 0001
2 -> 0000 0010
想必大家都知道现阶段我们使用的计算机数据存储运算都是二进制数据

到了后来在我们生活中为了表示“你欠我钱”等等这个概念,所以划分出了『正数』、『负数』

那么相应的计算机世界就出现了 原码 这个概念

原码:把最左边的一位腾出来表示正负,0 表示正数,1 表示负数
//原码
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1000 0001
-2 -> 1000 0010

当计算机世界发明了原码之后出现一个棘手的问题,就是自然界中 1 + (-1) = 0 而计算机的计算结果呢 00000001 + 10000001 = 10000010 (-2) 咦这个结果可不对啊,怎么办呢

所以聪明的人类又给计算机世界发明了 反码

反码:正数的反码与其原码相同,负数的反码是符号位不变其他位取反
//反码
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1111 1110
-2 -> 1111 1101

这个问题解决了但是又出现了一个新的问题,00000001 + 11111110 = 11111111 (-0) 这样一来在计算机中出现了两个 0 这可不行。

//反码
+0 -> 0000 0000
-0 -> 1111 1111

怎么办呢,人们又为计算机世界贡献了 补码 的概念

补码:正数的补码与其原码相同,负数在反码的基础上 +1
//补码
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1111 1111
-2 -> 1111 1110

这样一来 00000001 + 11111111 = 1 0000 0000 可是位数超了可是我们的存储空间就 8 bit 怎么办呢,所以就舍去 1 保留 00000000 (0)

这样一来就完美了,在计算机世界中进行数据运算就和我们的规则就统一了

事情的原委

上述过程在现实发展中肯定不是这个过程,因为这是我胡乱造的(哈哈,是不是有点信以为真),但是他们的出现确实是为了解决上面说的问题。

我想你一定听说过半加器、全加器但是肯定没有听说过半减器、全减器之类的减法器。那么为什么没有呢?其实是当年硬件工程师“偷了个懒”,其实这个也是有说头的。稍微了解一点硬件的都知道做加法器、减法器都需要一定的电路,也就需要占用一定的空间。所以当时的科学家们就想出了一个办法让加法和减法直接复用同样一个电路,就可以省掉这部分电路了。所以你肯定你也能理解为什么正整数的补码与原码一致,而负整数的补码却要经过一定的规则进行转换。

所以当时数学科学家、计算机科学家们想出了补码这个东西来节省了硬件,同时实现了功能。

小结

通过这篇文章我们了解了原码、反码、补码

原码:把最左边的一位腾出来表示正负,0 表示正数,1 表示负数
反码:正数的反码与其原码相同,负数的反码是符号位不变其他位取反
补码:正数的补码与其原码相同,负数在反码的基础上 +1

上面还迁移默化的说了一个问题不是到各位观众老爷看出来了没

就是现代计算机运算都是先换算成补码然后进行运算的

有说的不明白的地方欢迎各位拍砖