原码
原码由第一位的符号位和后面的数值位构成,如32位二进制中:
| 数值 | 原码 |
|---|---|
| $1$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001$ |
| $-1$ | $1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001$ |
| $2147483647$ | $0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
| $-2147483647$ | $1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
| $0$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ $1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ |
所以32位二进制用原码表示的范围是 $[-2147483647, 2147483647]$,其中 $0$ 有两种表示方法,因为 $0$ 是不分正负的
反码
正数的反码是其原码本身,负数的反码是符号位不变,数值位的每一位都取反,如32位二进制中:
| 数值 | 反码 |
|---|---|
| $1$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001$ |
| $-1$ | $1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1110$ |
| $2147483647$ | $0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
| $-2147483647$ | $1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ |
| $0$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ $1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
所以32位二进制用反码表示的范围是 $[-2147483647, 2147483647]$,其中 $0$ 有两种表示方法
补码
正数的补码是其原码本身,负数的补码是其反码加 $1$,如32位二进制中:
| 数值 | 反码 |
|---|---|
| $1$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001$ |
| $-1$ | $1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
| $2147483647$ | $0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111$ |
| $-2147483647$ | $1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001$ |
| $0$ | $0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ |
| $-2147483648$ | $1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000$ |
所以32位二进制用反码表示的范围是 $[-2147483648, 2147483647]$,其中 $0$ 只有一种表示方法