计算机中的编码

破译计算机的“密码本”: 深入理解计算机中的编码

哈喽! 👋 有没有想过,我们每天在电脑上看到的文字、数字、图片、视频… 这些丰富多彩的信息,在计算机内部,其实都被 “翻译” 成了一种 神秘的 “代码” 呢? 这就像我们人类之间的交流,需要用到 “语言” 一样,计算机内部的信息处理,也离不开 “编码”

想象一下,你要给远方的朋友寄一封 “秘密情书”。💌 为了防止信件在途中被 “ посторонние глаза” 偷窥,你可能会使用一种 只有你和朋友才能看懂的 “密码”,例如,把 “我爱你” 编码成 “1314520”。 只有知道 “密码本” 的人,才能将这串数字 “解码” 回 “我爱你” 的真实含义。

计算机中的 “编码”,其实就扮演着类似 “密码本” 的角色。 它定义了一套 规则,将我们人类能够理解的各种 “信息” (例如,数字、文字、符号、颜色、声音等等)转换成计算机能够 “理解” 和 “处理” 的 ** 二进制代码 (0 和 1 的组合)。 反之,计算机处理完的二进制代码,也可以通过 “解码”,还原成我们人类能够理解的信息形式。

今天,我们就来深入探索 计算机中的 “编码”, 看看它是如何 “施展魔法”,让计算机能够 “读懂世界” 的! ✨

🔢 第一章: 数值数据的表示

计算机如何表示我们常用的数字呢? 本章,我们就来揭秘数值数据在计算机中的表示方法, 就像给数字 “穿上二进制外衣”。

1. “真值”与“机器数”: 数字的 “身份” 与 “面具”

在探讨编码之前,我们需要区分 “真值”“机器数” 这两个关键概念。

  • 真值 (True Value): 这是数字的真实数学值,带正负号,是我们人类直接理解的数值,例如 +3, -5, 3.14159。

  • 机器数 (Machine Number): 这是数字在计算机内部的二进制存储形式。 由于计算机只能处理二进制,真值必须经过编码转化为机器数才能被计算机理解和运算。 机器数就像是数字的“伪装面具”,用于适应计算机的处理方式。

简单来说,真值是数字的“姓名”,机器数是数字的“身份证号”。 计算机处理的是“身份证号”(机器数),最终呈现给我们的是“姓名”(解码后的真值)。

2. 数值数据的编码方式: “化妆术”大揭秘

为了有效地在计算机中表示数值,人们设计了多种编码方式。 我们将详细介绍以下四种核心编码:原码、反码、补码和移码。

(1) 原码 (Sign-Magnitude): 简单直接的 “原始面貌”

原码 是最直观的编码方式,它直接将符号和数值大小分开表示:

  • 符号位: 最高位表示符号,0 为正,1 为负。
  • 数值位: 其余位表示数值的绝对值。

例如 (8位二进制)

  • +7 的原码: 00000111
  • -7 的原码: 10000111
  • +0 的原码: 00000000
  • -0 的原码: 10000000 (注意正负零编码不同)

优点: 直观易懂,真值与原码转换简单。
缺点: 正负零表示重复,加减运算复杂,符号位需单独处理。
适用场景: 常用于数值与真值的转换,以及数据传输,早期计算机可能使用。

(2) 反码 (One’s Complement): 减法运算的“过渡方案”

反码 是为简化减法运算而设计的过渡编码,它在原码基础上改进了负数表示:

  • 正数: 反码与原码相同。
  • 负数: 符号位同原码 (为 1),数值位对原码数值位 按位取反 (0变1, 1变0)。

例如 (8位二进制)

  • +7 的反码: 00000111
  • -7 的原码: 10000111
  • -7 的反码: 11111000 (数值位取反)
  • +0 的反码: 00000000
  • -0 的反码: 11111111 (正负零编码仍不同)

优点: 减法可转换为加法,简化运算规则。
缺点: 正负零表示仍然冗余,跨零运算需循环进位,运算规则仍复杂。
适用场景: 现代计算机基本不用,是原码到补码的过渡,用于教学和理论研究。

(3) 补码 (Two’s Complement): 现代计算机的 “主流方案” (重点和难点)

补码 是现代计算机系统中最核心的数值编码方式,它完美解决了原码和反码的缺陷,实现了加法和减法的统一。

补码的编码规则

  • 正数: 补码与原码、反码相同。
  • 负数: 反码加 1,即为补码。 或者,从原码最低位起,保持 0 不变,直到遇到第一个 1,此 1 也保留,之后左侧所有位按位取反。

例如 (8位二进制)

  • +7 的补码: 00000111
  • -7 的原码: 10000111
  • -7 的反码: 11111000
  • -7 的补码: 11111001 (反码加1)
  • +0 的补码: 00000000
  • -0 的补码: 00000000 (正负零编码相同!)

优点

  • 零的表示唯一,消除冗余。
  • 加减法统一,加法和减法可用同一套硬件电路实现。计算 a-b 等价于计算 a + (-b),而 -b 的补码可由 b 的补码直接求得(求补运算:按位取反,末位加1)。
  • 符号位参与运算,运算结果符号位自然正确,溢出判断更方便。

缺点: 编码规则相对复杂,初学者理解需绕一些弯。
适用场景: 现代计算机系统的主流编码方式,用于表示和运算带符号整数。 理解补码是理解计算机运算器工作原理的关键。

(4) 移码 (Offset Binary / Excess-K): 浮点数的 “专属编码”

移码 也称增码,主要用于表示 浮点数的阶码。 移码的特点是 将真值整体平移,将有符号数变为无符号数,便于比较大小和排序。

移码的编码规则 (基于补码):

  • 正数和零: 移码与补码相同。
  • 负数: 负数补码的 符号位取反,数值位不变。

另一种定义 (基于偏移量 K):

移码=真值+偏移量K移码 = 真值 + 偏移量K

通常 K 取 $2^{n-1}$ 或 $2^{n-1} - 1$ (n 为数据位数)。

例如 (8位二进制,K=128)

  • +7 的补码/移码: 00000111
  • -7 的补码: 11111001
  • -7 的移码: 01111001 (补码符号位取反)
  • +0 的补码/移码: 00000000
  • -0 的补码/移码: 00000000

优点

  • 保持数值大小相对顺序,移码越大真值越大。
  • 零值表示唯一,同补码。
  • 将有符号数转为无符号数,方便大小比较和排序。

适用场景: 主要用于 浮点数阶码的表示,方便浮点数比较和排序。

3. 定点数与浮点数: 小数点,固定还是浮动?

计算机如何表示带小数点的数呢? 答案是 定点数浮点数

  • 定点数 (Fixed-Point Number): 小数点位置固定。 小数点位置预先约定,不再显式表示。 例如,约定小数点在第 4 位后,二进制 0000.1011 表示十进制 0.6875。

    优点: 表示和运算简单快速,硬件实现容易,成本低。
    缺点: 表示范围和精度有限,不适合表示极大或极小数,动态范围差。
    适用场景: 整数、小数位数少且范围变化不大的数据,早期计算机,嵌入式系统,图像像素值,音频采样值,游戏简单数值逻辑。

  • 浮点数 (Floating-Point Number): 小数点位置浮动。 采用科学计数法表示,由尾数 (精度)阶码 (范围) 决定。

    浮点数=尾数×阶码浮点数 = 尾数 × 基数^{阶码}

    常用基数为 2 (二进制浮点数)。

    优点: 表示范围极大,精度很高,动态范围广。
    缺点: 表示和运算复杂,硬件成本高,速度相对较慢,存在精度损失 (舍入误差) 问题。
    适用场景: 数值范围大,精度要求高的场合,科学计算,工程计算,金融计算,现代计算机系统,绝大多数应用程序,游戏开发(角色位置、物理模拟、美术资源等)。

总结: 数值数据表示方式对比

数值类型 小数点位置 表示范围 精度 运算速度 硬件复杂度 适用场景 游戏开发应用
定点数 固定 有限 有限 整数,小数位数不多,数值范围变化不大 角色血量、金币 (简单逻辑),早期游戏
浮点数 浮动 非常大 数值范围很大,精度要求高,通用程序,科学计算,工程计算 角色位置、速度、角度、光照、颜色、物理模拟、AI,现代游戏引擎,美术资源

🎭 第二章: 非数值数据的表示

计算机不仅处理数字,还需要处理字符、文字等非数值数据。 本章,我们将探索计算机如何编码这些信息,让它成为真正的 “百变星君”。

1. 字符编码: ASCII 码、Unicode 编码 (了解)

字符编码是将字符映射为计算机可识别的二进制代码的规则。

(1) ASCII 码 (American Standard Code for Information Interchange): “字符编码老前辈”

ASCII 码 是最早且应用最广泛的字符编码标准,定义了 128 个常用字符 (英文字母、数字、标点、控制字符) 与 7 位二进制代码的对应关系。

特点

  • 编码简单,易于实现,高效。
  • 应用广泛,兼容性好,国际通用标准。

局限性

  • 仅限英文字符和常用符号,无法表示其他语言字符。
  • 字符数量有限 (128个),难以满足全球信息交换需求。

适用场景: 英文字符和控制字符为主的应用,早期系统,简单文本文件,低带宽/存储场景。

(2) Unicode 编码: “字符编码世界语” (了解)

Unicode 编码 (统一码、万国码) 旨在统一全球所有语言的字符编码,实现无障碍信息交流。 Unicode 收录了超过 14 万个字符,包括各种语言文字和符号,且持续扩充。

特点

  • 容量巨大,容纳世界所有语言字符,实现“统一编码,通行全球”。
  • 兼容 ASCII, 保留 ASCII 编码空间,原有 ASCII 编码文本可无缝迁移。
  • 多种实现方式 (UTF-8, UTF-16, UTF-32)。 Unicode 仅定义字符集和码点,具体编码为二进制字节流由 UTF 等方案实现。

Unicode 实现方式 (UTF 家族)

  • UTF-8 (Unicode Transformation Format - 8-bit): 最流行、应用最广的 Unicode 实现。 变长编码,字符用 1-4 个字节表示,英文兼容 ASCII (1字节),常用汉字3字节,生僻字4字节。 优点是通用性强、节省空间 (英文文本)

  • UTF-16 (Unicode Transformation Format - 16-bit): 变长编码,字符用 2 或 4 字节表示,常用 Unicode 字符区 (BMP) 使用 2 字节,扩展区使用 4 字节。 优点是BMP区字符定长,编码效率较高

  • UTF-32 (Unicode Transformation Format - 32-bit): 定长编码,所有字符均用 4 字节表示。 优点是编码规则简单,查找和计算字符长度效率高,但 占用空间大

游戏开发应用: 游戏中需显示多语言文本(角色名、UI 文本、剧情对话),Unicode 编码是基础。 美术师和建模师制作的 字体文件 需支持 Unicode 字符集,才能显示各种语言文字。 UTF-8 是Web 和文本文件常用编码,也常用于游戏资源文件编码。

2. 汉字编码: GBK, UTF-8 等 (了解)

由于汉字数量庞大,ASCII 码无法表示,因此中国制定了一系列汉字编码标准。

  • GBK (Chinese Internal Code Specification)向下兼容 GB2312 的扩展编码,收录 2万+汉字,包括简体、繁体汉字和日韩字符。 双字节编码,兼容 ASCII (单字节)。 GBK 仍广泛应用于部分中文Windows 系统和一些老的中文软件

  • UTF-8目前最通用的汉字编码,Unicode 的一种实现方式。 UTF-8 中的汉字通常用 3 个字节 表示,可以表示 Unicode 字符集中所有汉字,具有 全球通用性UTF-8 已成为 Web 页面、Linux/macOS 等系统、以及各种新开发的软件的默认汉字编码

游戏开发应用: 游戏中显示中文文本,需使用汉字编码。 UTF-8 是现代游戏开发中最推荐的汉字编码,支持全球多语言,兼容性好。 GBK 在一些老旧项目或特定平台可能仍有应用。 美术师制作字体时,需考虑字体文件支持的汉字编码范围。

总结: 非数值数据编码

编码类型 主要用途 编码特点 适用场景 游戏开发应用
ASCII 码 英文字符及控制字符 7位编码,简单高效,兼容性好,字符数有限 英文环境,早期系统,简单文本,低带宽/存储 UI 英文文本 (早期游戏)
Unicode 编码 全球所有语言字符 容量巨大,统一编码,兼容ASCII,多种实现方式 (UTF-8, UTF-16, UTF-32) 全球信息交换,多语言环境,现代操作系统和应用 多语言文本显示,字体文件基础,UTF-8常用于游戏资源文件
GBK 汉字编码 汉字 (简体、繁体),兼容ASCII 双字节编码,向下兼容GB2312,收录2万+汉字 中文Windows系统 (部分),老旧中文软件 老旧游戏项目,特定平台中文显示
UTF-8 汉字编码 汉字 (Unicode 所有汉字) Unicode 实现,变长编码 (汉字3字节),全球通用性,兼容ASCII Web页面,Linux/macOS,现代软件,通用性要求高的场合 现代游戏开发首选汉字编码,多语言支持,资源文件编码

📖 总结: 编码,连接人类与计算机世界的桥梁

恭喜你,完成了这次 “计算机编码” 的探索之旅! 我们一起揭秘了计算机如何用 “编码” 这把 “钥匙”, 打开了 “理解世界” 的大门。 从数值数据 (数字) 的原码、反码、补码、移码、定点数、浮点数, 到非数值数据 (字符、文字) 的 ASCII 码、Unicode 编码、汉字编码… 我们学习了各种编码的原理、特点、适用场景, 也了解了它们在计算机系统和游戏开发中的重要作用。

编码是计算机世界的 “基石”, 是连接人类语言和机器语言的 “桥梁”。 理解编码, 不仅能帮助我们 更深入地理解计算机的工作原理 , 也能 更好地应用于游戏开发、美术设计、建模制作等领域 , 创造出更精彩、更高效的数字世界!

希望这篇文章能为你打开 “编码世界” 的大门, 激发你继续探索计算机奥秘的兴趣! 未来,还有更多有趣的 “密码” 等待我们去破译! 🚀✨


计算机中的编码
https://god23bin.github.io/unreal-engine-blog/2024/12/02/cs/co/co-for-beginner/number-system-and-coding/计算机中的编码/
作者
god23bin
发布于
2024年12月2日
许可协议