计算机只认识 0 和 1,那它是如何表示负数的?科学家们为此设计了三种编码方案,依次改进,最终解决了这个问题。
2.3
计算机只认识 0 和 1,那它是如何表示负数的?科学家们为此设计了三种编码方案,依次改进,最终解决了这个问题。
符号位约定:最高位(最左边)表示正负,0 代表正数,1 代表负数,其余位存储数值。以 8 位(1 字节)为例:
| 1 | 0 0000101 → +5(符号位为 0,表示正数) |
| 2 | 1 0000101 → -5(符号位为 1,表示负数) |
| ── 原码(错误)────────────────── | |
| 0 0000101 (+5) | |
| + 1 0000101 (-5) | |
| ────────── | |
| 1 0001010 = -10,完全不对!✗ | |
| ── 反码(接近但有瑕疵)─────────── | |
| 0 0000101 (+5 的反码) | |
| + 1 1111010 (-5 的反码) | |
| ────────── | |
| 1 1111111 = -0,还是不对 △ | |
| ── 补码(正确!)──────────────── | |
| 0 0000101 (+5 的补码) | |
| + 1 1111011 (-5 的补码) | |
| ────────── | |
| 1 0 0000000 最高位进位溢出,自动丢弃 | |
| 0 0000000 = 0 完全正确!✓ |
| 十进制 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 |
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 | (不存在!) |
| -128 | 无法表示 | 无法表示 | 1000 0000 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 |
| +127 | 0111 1111 | 0111 1111 | 0111 1111 |
1000 0000 被用来表示 −128。8 位补码能表示 256 个数:−128~−1(128 个)加上 0~127(128 个),比原码多表示一个数。