转载请标明地址 QuincySx:www.jianshu.com/p/f134b15ff…bash
数字最先被咱们在天然界抽象出来的时候本没有正负之分,好比一我的,两我的,三我的。没有负一我的之说ui
那么在计算机表示数字的时候也是没有正负之分,如今咱们假设计算机是用 1 字节也就是 8 bit 来存储数据,那么数字 一、2 再计算机中如何表示呢spa
//无符号
1 -> 0000 0001
2 -> 0000 0010
复制代码
想必你们都知道现阶段咱们使用的计算机数据存储运算都是二进制数据设计
到了后来在咱们生活中为了表示“你欠我钱”等等这个概念,因此划分出了『正数』、『负数』code
那么相应的计算机世界就出现了 原码 这个概念get
原码:把最左边的一位腾出来表示正负,0 表示正数,1 表示负数it
//原码
+1 -> 0000 0001
+2 -> 0000 0010
-1 -> 1000 0001
-2 -> 1000 0010
复制代码
当计算机世界发明了原码以后出现一个棘手的问题,就是天然界中 1 + (-1) = 0 而计算机的计算结果呢 00000001 + 10000001 = 10000010 (-2) 咦这个结果可不对啊,怎么办呢class
因此聪明的人类又给计算机世界发明了 反码基础
反码:正数的反码与其原码相同,负数的反码是符号位不变其余位取反二进制
//反码
+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
上面还迁移默化的说了一个问题不是到各位观众老爷看出来了没
就是现代计算机运算都是先换算成补码而后进行运算的
有说的不明白的地方欢迎各位拍砖