在十进制中,数字前面用减号来表示负数,而计算机只有 0 和 1,没有其他任何符号,它怎么表示负数呢?
这就涉及到计算机编码的问题了。
计算机编码
计算机内部用补码表示数字,高位为符号位,0开头表示正数,1开头表示负数。
二进制中的原码、反码和补码描述如下。
原码:就是数字本身。比如 1110 的原码就是 1110。
反码:将原码除符号位按位取反就是反码。比如 1110 的反码是 1001。
补码:将反码加 1 就是补码。比如 1110 的反码是 1001,补码就是 1010。
为什么要用补码呢?
因为可以避免负数和减法,利用高位溢出,将减法变成加法。这样,计算机就不用设计减法器了,直接用加法器就可以做减法了。
计算机只有加法器,没有减法器。
计算机用补码表示所有数字。正数的反码和补码都等于原码,负数的反码等于除符号位外其他位按位取反,负数的补码等于反码加 1。
| 二进制 | 反码 | 补码 |
|---|---|---|
| 正数 | 等于原码 | 等于原码 |
| 负数 | 除符号位按位取反 | 反码加 1 |
位运算
- 真值表
| p | q | p 与 q | p 或 q | !p | p异或q |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
- 补充
- 左移:低位补 0,等于乘法。
- 右移:高位补符号位,正数等于除法,负数可以先按正数计算,然后转成负数。
- 无符号右移:高位补 0。