原码、反码、补码
原码
原码由第一位的符号位和后面的数值位构成,如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\) 只有一种表示方法