进制转换与数据编码


进制转换

R进制转十进制

R进制转十进制使用按权展开法,具体操作是将R进制的每一位数值使用$R^K$的形式表示,K表示该位与小数点的距离,当该位位于小数点左边,K表示该位和小数点之间间隔数字的个数,当该位位于小数点右侧,K是负数,其绝对值是该位与小数点之间数字个数加1

例如:
二进制 转 十进制 $$ 10100.01 = 1 \cdot 2^4 + 1 \cdot 2^2 + 1 \cdot 2^{-2} $$
七进制 转 十进制 $$ 604.01 = 6\cdot7^2+4\cdot7^0+1\cdot7^{-2} $$

十进制转R进制

十进制转R进制使用短除法
例如将94转换成二进制数

94 ÷ 2 = 47 余 0
47 ÷ 2 = 23 余 1
23 ÷ 2 = 11 余 1
11 ÷ 2 = 5  余 1
5  ÷ 2 = 2  余 1
2  ÷ 2 = 1  余 0
1  ÷ 2 = 0  余 1  

将余数从后往前书写就是对应的二进制 1011110

二进制转八进制

二进制的 111 表示 八进制的 7000表示八进制的0,二进制转换成八进制时,将二进制从低到高分为3个一组,高位不足三个的补0,分别进行转换
例如10001110转换成8进制为 216

010 001 110
2	1	6

二进制转十六进制

二进制的1111表示 十六进制的 150000表示十六进制的0,二进制转换成十六进制时,将二进制从低到高分为4个一组,高位不足三个的补0,分别进行转换,而在十六进制中10-15分别使用A-F进行表示
例如 1000 1110 转换成16进制为 8E

1000 1110
8     E

数据编码

原码

  • 定义:

    • 最高位(最左边的一位)为符号位:0 表示正数,1 表示负数。
    • 其余位为数值位:表示这个数的绝对值的二进制形式。
  • 示例:

    • +5 -> 0000 0101 (符号位0,数值是5)
    • -5 -> 1000 0101 (符号位1,数值是5)
  • 优点:非常直观,容易理解。

  • 缺点:

    • 存在 +0 和 -00000 0000 和 1000 0000 都表示0。这会造成歧义和计算上的麻烦。
    • 运算复杂:CPU的电路设计会变得复杂。例如,做加法时,必须先判断两个数的符号位。如果符号不同,实际上要做的是减法,并且还要判断结果的符号。这大大降低了计算效率。

      反码

  • 定义:

    • 正数的反码:与其原码相同
    • 负数的反码:将其对应正数的原码按位取反(包括符号位,但结果依然是1表示负)。
  • 示例:

    • +5 的原码是 0000 0101,所以它的反码也是 0000 0101
    • -5 的反码:先取 +5 的原码 0000 0101,然后所有位按位取反(0变1,1变0),得到 1111 1010
  • 优点:引入反码后,减法可以用加法来实现。因为 X - Y 等价于 X + (-Y)

  • 缺点:

    • 仍然存在 +0 和 -0**:

      • +0 的反码:0000 0000
      • -0 的反码:1111 1111
    • 计算循环进位:用反码进行运算时,如果最高位有进位,需要把这个进位“循环”加到结果的最低位(称为“循环进位”或“端回进位”),电路实现仍然不够优雅

      反码的核心贡献是:它首次实现了“将减法运算转换为加法运算”,从而简化了计算机内部运算器的设计。

      补码

  • 定义:

    • 正数的补码:与其原码相同。
    • 负数的补码:将其对应正数的原码按位取反后,再加1
  • 示例(8位):

      • +5 的补码:0000 0101 (和原码一样)
    • -5 的补码:
      1. 取 +5 的原码 0000 0101
      2. 按位取反得到 1111 1010 (这一步得到的是反码)
      3. 再加1,得到 1111 1011
  • 核心优点:

    1. 唯一的0:0 的补码只有一种表示:0000 0000。计算 -0(即对 0000 0000 操作):取反 1111 1111,加1后变成 (1)0000 0000,最高位1溢出,剩下 0000 0000,仍然是0。
    2. 无缝的加减法:可以将减法统一用加法来实现,不需要任何额外的判断和循环进位。CPU只需要设计一个加法器电路就可以同时处理加法和减法,极大地简化了硬件设计。
    3. 表示范围更合理:对于n位二进制,补码能表示的范围是 **[-2ⁿ⁻¹, 2ⁿ⁻¹ - 1]**。例如8位补码的范围是 -128 到 +127。比原码和反码的 -127 到 +127 多表示了一个数 (-128)。

      移码

  • 定义:

    • 在补码的基础上,将符号位取反
      • 更通用的定义是:对一个数 X,将其加上一个固定的偏移值 Offset(通常是 2ⁿ⁻¹ 或 2ⁿ⁻¹ - 1),然后再用二进制表示。
  • 示例(8位,偏移量 Offset = 127)

    • +5:其补码是 0000 0101。加上偏移量 127 后是 132132 的二进制是 1000 0100
    • -5:其补码是 1111 1011。加上偏移量 127 后是 122122 的二进制是 0111 1010
      (如果采用“符号位取反”法:+5的补码是0000 0101,符号位取反得1000 0101-5的补码是1111 1011,符号位取反得0111 1011。这种方法的结果与标准移码定义通常差1,但比较大小的特性一致)
  • 核心优点:
    便于比较:移码表示的所有数(正、负、零),其二进制的大小关系与它所代表的真值的大小关系是完全一致的。计算机可以直接用比较无符号整数的方式来比较移码的大小,速度极快。这对于浮点数运算中判断指数大小至关重要。

    数值表示范围

码制 定点整数 定点小数
原码 $-(2^{n-1}-1)$ ~ $(2^{n-1}-1)$ $-(1-2^{-(n-1)})$ ~ $(1-2^{-(n-1)})$
反码 $-(2^{n-1}-1)$ ~ $(2^{n-1}-1)$ $-(1-2^{-(n-1)})$ ~ $(1-2^{-(n-1)})$
补码 $-2^{n-1}$ ~ $(2^{n-1}-1)$ -1 ~ $(1-2^{-(n-1)})$
移码 $-2^{n-1}$ ~ $(2^{n-1}-1)$ -1 ~ $(1-2^{-(n-1)})$

浮点数的运算

浮点数表示

计算机中通常使用科学计数法的二进制实现,可以在固定长度的存储空间中表示极大范围、不同精度的实数。
浮点数表示:$N = 尾数 \cdot 基数 ^ {指数}$
例如 $3.14 \times 10^3$

  • 尾数:3.14
  • 基数:10
  • 指数:3

    运算过程

例如 $3.14 \times 10^3 + 1.2 \times 10^5$

  • 对阶,将两个数据的指数转换成相同的,小的往大的对
    • $0.0314 \times 10^5 + 1.2 \times 10^5$
  • 尾数计算
    • $0.0314 + 1.2 = 1.2314$
  • 结果格式化
    • $1.2314 \times 10^5$

      特点

  1. 尾数用补码,阶码用移码
  2. 阶码的位数决定数的表示范围,位数越多范围越大
  3. 尾数的位数决定数的有效精度,位数越多精度越大
  4. 对阶时,小数向大数看齐
  5. 对阶是通过较小数的尾数右移实现的

文章作者: gloamfox
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gloamfox !
 上一篇
告别分类焦虑:让笔记自然生长流动
文章探讨了笔记管理方式的演进历程,从严格分类到标签系统,再到双链笔记,最终形成适合个人的混合模式。作者分享了不同方法的优势与局限,强调笔记管理应服务于学习和思考,而非管理本身,减少心智负担比追求完美组织更重要。
2026-03-03
下一篇 
高并发基石:IO多路复用深度剖析
本文详细介绍了操作系统中的用户空间与内核空间概念,解释了它们分离的原因与交互方式,并深入分析了五种IO模型(阻塞IO、非阻塞IO、信号驱动IO、异步IO和多路复用IO)的技术特点、优缺点及适用场景。重点探讨了IO多路复用机制(select、poll、epoll)的工作原理和性能优势,并分析了为什么在实际应用中多路复用成为主流选择的原因。
  目录