Atri Website

Back

1. 进位计数制#

1

核心考点:各种进制:2、8、10、16 进制之间的转换

数值单位的表示:

  • B:二进制
  • D:十进制
  • O:八进制
  • H:十六进制

任意进制转为十进制的方法#

2

实际上就是源字符串,例如图中的八进制数 251.5251.5,对第 N 分位上的数乘上权重即可。(八进制的权重是八)

二、八、十六进制之间的快速转换#

3

从二进制转为八进制,可以把源二进制串从小数点看为两部分:整数部分和小数部分。然后每三位就是一个八进制数,不够的补 0。例如图中小数点后的 01101 字符串,由于最后的 01 不够三位,所以很自然地补一个 0 。

从二进制转为十六进制同理。

由此可逆向得到从八/十六进制转为二进制的方法:对每一分位的数字,将其转为对应位数的二进制串即可。

短除法实现十进制转换#

4

5

注意:整数部分是除法,小数部分使用乘法,满 1 则取余后继续计算小数部分。

实际上,最简单的方法是先转为二进制后,再求其他的进制,例如八进制、16 进制,因为一眼就能看出来

真值和机器数#

6

因为数值一般带有正负性,因此需要在转换后的二进制串的最高位加一位,用于表示该串的正负性。

总结#

重点就是各种进制的转换,没什么好说的

7

2. 定点数的编码表示#

本章涉及:

  1. 无符号数
  2. 有符号数:原码、反码、补码、移码

2.1. 定点数与浮点数#

定点数:小数点的位置固定,例如 996.007常规计数996.007\to常规计数

浮点数:小数点的位置不固定, 例如 9.96007102科学计数法9.96007* 10^2\to科学计数法

2.2. 无符号数#

无符号数即整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。

1001 1100 B 为例,其数值表示 156D

重点:n 位无符号数的表示范围:02n10\to2^n-1

如果以 8 bit 为最大位数,那么可表示的范围就是 0 到 255

一般无符号数没有小数,只有整数。可从 C 语言的变量定义 unsign int 看出。

2.3. 有符号数#

8

定点整数的表示:我们一般都约定(默认)小数点位于数值部分最位后面,然后有效数值部分的前一位置为符号位

定点小数的表示:我们一般都约定(默认)小数点位于数值部分最位后面,然后有效数值部分的前一位置为符号位

由于符号位在最高位,故我们也称数值部分为 “尾数”

Note:在计算机里,一个有符号数定点数据是分为整数和小数两部分独立存储的,小数点的位置是人为约定的,计算机里并没有‘小数点’这种东西。因此无需关系它是整数还是小数,重点应该是尾数和符号位

以下介绍定点有符号数的四种表示方法

2.3.1. 原码#

用尾数表示真值的绝对值,用符号位的 “0/1” 表示“正/负”

9

请注意红框部分,实际上数值为 10011,多出的 “1,” 部分是为了更清晰地表示这个数的正负性,人为加上的,千万不要带入数值部分。

重点:原码可表示的数值范围。

若机器字长 n+1 位,原码整数的表示范围:(2n1)x2n1-(2^n-1)\leq x \leq 2^n -1,因为真值的 “0” 有 +0 和 -0 两种形式,因此最终的数值范围会减一

如果字长 n + 1,小数的表示范围为:(12n)x12n-(1-2^{-n})\leq x \leq 1-2^{-n},绝对值范围为:012n0 \to 1-2^{-n}

2.3.2. 反码#

  • 符号位是 0(正数),反码和原码相同
  • 符号位是 1,数值部分全部取反

10

2.3.3 补码#

  • 正数的补码就是原码
  • 负数的补 = 反码末位 + 1

11

重点

  1. 补码的表示范围:
    • 整数:2nx2n1-2^n \leq x \leq 2^n-1
    • 小数:1x12n-1 \leq x \leq 1-2^{-n}
  2. 负数的原码、补码间的相互转换 \to 尾数取反,末位加一

补码的表示范围推导、补码与原码的范围关系,正负 0 为什么在补码里用同一种形式存储这三个问题的解决请看这篇文章

2.3.4 移码#

移码:补码的基础上将符号位取反。

注意:移码只能用于表示整数

移码和补码一一映射。

12

小结#

原码:使用最高位的符号位的 “0/1” 表示 “正/负”

反码:正数和原码相同,负数则尾数取反,符号位不变

补码:正数和原码相同,负数则尾数取反 + 1(反码 + 1)

移码:在补码基础上,符号位取反

2.4. 习题#

13

3. C 语言中的整数类型及类型转换#

  • 短整型:short,高位截断,保留低位 16 位
  • 整型:int,32 位
  • 长整型:long 在 32 位系统里为 32 位,63 位系统里为 64 位

14

  • 蓝色:同位数下,无符号数与有符号数之间的转换。实际上就是把最高位是否看作符号位的转换
  • 绿色:把长整型转为短整型,高位截断,保留低位
  • 红色:符号扩展与零扩展。
    • 零扩展:当处理的数为无符号数时,高位直接补 0
    • 符号扩展:处理符号数时,依据符号位的正负(0/1)扩展高位。如果是 0(正数)则全补 0,负数同理。

图中示例的红色方框部分:

  1. 符号数 x 的符号位为 1,扩展为 4 字节时,高位全补 1
  2. n 对 x 进行同位数转换,变为无符号数
  3. p 是执行的零扩展(无符号数)
数制与编码
Author Juyao Huang
Published at March 15, 2026
Comment seems to stuck. Try to refresh?✨