跳转至

整数的二进制表示

  • 数制: 表示数量的规则.
  • 码制: 表示事物的规则.

整数常见的二进制表示有以下三种:

原码(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 只存在一种表示方法.

评论