skip to content

Search

整数的表示

5 min read Updated:
森林,丁达尔效应

整数的表示方法,包括无符号整数、有符号整数、补码等内容。

1.进制转换

二进制转十进制

10112=1×23+0×22+1×21+1×20=11101011_{2} = 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 11_{10}

十进制转二进制

分整数部分和小数部分两步进行:

  1. 整数部分:不断除以2,记录余数,直到商为0,然后将余数倒序排列。
  2. 小数部分:不断乘以2,记录整数部分,直到小数部分为0或者达到所需的精度。

例子:将10.625转换为二进制。

  • 整数部分10:

    10÷2=510÷ 2 = 5,余数0

    5÷2=25 ÷ 2 = 2,余数1

    2÷2=12 ÷ 2 = 1,余数0

    1÷2=01 ÷ 2 = 0,余数1

    整数部分二进制为1010。

  • 小数部分0.625:

    0.625×2=1.250.625 × 2 = 1.25,整数部分1

    0.25×2=0.50.25 × 2 = 0.5,整数部分0

    0.5×2=1.00.5 × 2 = 1.0,整数部分1

    小数部分二进制为0.101。

  • 最终结果:10.625的二进制表示为1010.101。

二进制用八、十六进制表示

  • 八进制:每3位二进制对应1位八进制。例如,二进制1010.101可以分为(001)(010).(101),对应的八进制为12.5。
  • 十六进制:每4位二进制对应1位十六进制。例如,二进制1010.101可以分为(0001)(0100).(1010),对应的十六进制为14.A。

2.整数的表示

无符号整数

无符号整数使用二进制表示非负整数,范围为0到2n−12^n - 1,其中n是二进制位数。

例如uint32_t类型的无符号整数使用32位二进制表示,范围为0到232−1=4,294,967,2952^{32} - 1 = 4,294,967,295。

有符号整数

有符号整数使用二进制表示正数和负数,常见的表示方法有原码、反码和补码。

原码

原码使用最高位表示符号,0表示正数,1表示负数,剩余位表示数值。例如,8位原码表示的范围为-127到127。

原码在处理负数时存在两个零(+0和-0)的问题。而且正数与负数的加减运算需要特殊处理。

反码

反码是原码的基础上将负数的每一位取反得到的表示方法。

反码在处理负数时也存在两个零的问题,并且加减运算仍然需要特殊处理。

补码

补码即按位取反加1,是目前最常用的有符号整数表示方法。

补码的优点是只有一个零(0),并且加减运算可以直接使用二进制加法器进行处理,无需特殊处理。

例子:

−8-8的8位补码表示为:

  1. 首先将8的二进制表示为00001000。
  2. 然后按位取反得到11110111。
  3. 最后加1得到11111000,即-8的补码表示。

补码加减原理:

以8位补码为例:

−8+5=−8+256+5//8位补码里加256相当于加 1 0000 0000,最高位溢出,值不变=−8+255+1+5=(1111 1111−0000 1000+0000 0001)+0000 0101//括号内是 −8 的补码(取反+1)=1111 1000+0000 0101=1111 1101//结果是 −3 的补码表示\begin{aligned} -8 + 5 &= -8 + 256 + 5 \quad \text{//8位补码里加256相当于加 }1\,0000\,0000\text{,最高位溢出,值不变} \\ &= -8 + 255 + 1 + 5 \\ &= (1111\,1111 - 0000\,1000 + 0000\,0001) + 0000\,0101 \quad \text{//括号内是 }-8\text{ 的补码(取反+1)} \\ &= 1111\,1000 + 0000\,0101 \\ &= 1111\,1101 \quad \text{//结果是 }-3\text{ 的补码表示} \end{aligned}

补码转为原码:

一样取反加1

补码取值范围:

  • 对于n位补码,范围是−2n−1-2^{n-1}到2n−1−12^{n-1}-1。
  • 例如int32类型的补码表示范围为-2,147,483,648到2,147,483,647。