码农养成记4——原码、反码、补码

582 阅读3分钟

转载请标明地址 QuincySx:www.jianshu.com/p/f134b15ff…

原码、反码、补码是什么

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

那么在计算机表示数字的时候也是没有正负之分,现在我们假设计算机是用 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

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

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

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