整数的二进制表示¶

数制: 表示数量的规则.

码制: 表示事物的规则.

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

原码 (sign-magnitude)¶

原码是一种结合了数制与码制用于表示二进制有符号数的方法.

用最高位表示符号, 0 表示正号, 1 表示符号, 使用了码制. 其他位用于存储该二进制数的绝对值.

以原码的方式解释二进制:

\[

B2S_w(\vec{x}) \doteq (-1)^{x_{w-1}} \cdot (\sum_{i=0}^{w-2}x_i2^i)

\]

template

long B2S(const std::bitset& 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

long B2T(const std::bitset& 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 只存在一种表示方法.

2025年9月29日

评论