整数的二进制表示
- 数制: 表示数量的规则.
- 码制: 表示事物的规则.
整数常见的二进制表示有以下三种:
原码 (sign-magnitude)
原码是一种结合了数制与码制用于表示二进制有符号数的方法.
用最高位表示符号, 0 表示正号, 1 表示符号, 使用了码制. 其他位用于存储该二进制数的绝对值.
以原码的方式解释二进制:
\[
B2S_w(\vec{x}) \doteq (-1)^{x_{w-1}} \cdot (\sum_{i=0}^{w-2}x_i2^i)
\]
template <size_t N>
long B2S(std::bitset<N> binary)
{
long deciaml = 0;
for(size_t i = 0; i < N - 2; i++)
deciaml += binary[i] * std::pow(2, i);
return deciaml * (binary[N - 1] ? -1 : 1);
}
\[
2_{10} = 0010_2 \\
-2_{10} = 1010_2 \\
+0_{10} = 0000_2 \\
-0_{10} = 1000_2
\]
这种表达方式十分简单, 可以直观的看出数字的正负和大小, 但使用了码制意味着无法直接进行数值运算. 且 0 存在 +0 和 -0 两种表示方法.
反码 (ones' complement)
正数和原码一致, 负数为原码除符号位外各位按位取反.
\[
2_{10} = 0010_2 \\
-2_{10} = 1101_2 \\
+0_{10} = 0000_2 \\
-0_{10} = 1111_2
\]
补码 (two's complement)
以补码的方式解释二进制:
\[
B2T_w(\vec{x}) \doteq -x_{w-1}2^{w-1} + \sum_{i=0}^{w-2}x_i2^i
\]
template <size_t N>
long B2T(std::bitset<N> binary)
{
long deciaml = binary[N - 1] * std::pow(-2, N - 1);
for(size_t i = 0; i < N - 2; i++)
deciaml += binary[i] * std::pow(2, i);
return deciaml;
}
\[
2_{10} = 0010_2 \\
-2_{10} = 1110_2 \\
0_{10} = 0000_2 \\
\]
0 只存在一种表示方法.