计算机中的信息表示 - 数据篇

计算机中的信息表示 - 数据篇
28.7的博客计算机中的信息表示 - 数据篇
计算机以二进制(0和1) 作为底层信息存储与运算的基础,所有数据(数值、字符、图像等)最终都需转换为二进制形式。本文将从数值表示(原码、反码、补码)和字符编码(ASCII及扩展体系)两大核心维度,详解计算机如何“理解”数据。
一、数值表示:原码、反码与补码
计算机处理数值时需区分正负,因此引入“符号位”(最高位,0表示正数,1表示负数)。原码、反码、补码是二进制数值的三种表示方式,核心差异在于负数的处理逻辑,最终补码因解决了原码/反码的缺陷,成为计算机实际使用的标准。
1. 原码(True Form)
定义
最高位为符号位(0正/1负),其余位(数值位)直接表示数值的绝对值。是最直观的二进制表示方式。
示例(8位系统,1字节=8位)
| 十进制数值 | 原码(二进制) | 说明 |
|---|---|---|
| +5 | 0000 0101 | 符号位0(正),数值位0101 |
| -5 | 1000 0101 | 符号位1(负),数值位0101 |
| +0 | 0000 0000 | 符号位0,数值位全0 |
| -0 | 1000 0000 | 符号位1,数值位全0 |
核心问题
- 存在“+0”和“-0”:逻辑上0无正负,此设计浪费1个存储单元(8位系统中
1000 0000本可表示其他数值)。 - 无法直接加减:需先判断两数符号(同号相加、异号相减),再处理数值位,导致硬件电路设计复杂。
2. 反码(Ones’ Complement)
为解决原码“无法直接加减”的问题,反码对负数的数值位进行优化。
定义
- 正数:与原码完全相同(符号位0,数值位不变)。
- 负数:符号位不变(仍为1),数值位按位取反(0→1,1→0)。
示例(8位系统)
| 十进制数值 | 原码(二进制) | 反码(二进制) | 说明 |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 正数反码=原码 |
| -5 | 1000 0101 | 1111 1010 | 符号位1不变,数值位0101→111010 |
| +0 | 0000 0000 | 0000 0000 | 正数反码=原码 |
| -0 | 1000 0000 | 1111 1111 | 符号位1不变,数值位全0→全1 |
核心问题
- 仍存在“+0”和“-0”:未解决原码的存储浪费问题。
- 加减法需“循环进位”:两数相加时,若最高位(符号位)产生进位,需将进位值“循环”加到结果的最低位,增加硬件运算延迟。
反码循环进位示例(计算 3 + (-2))
- 3的反码:
0000 0011 - -2的反码:
1111 1101 - 反码相加:
0000 0011 + 1111 1101 = 1 0000 0000(最高位产生进位1) - 循环进位:将进位1加到最低位 →
0000 0000 + 1 = 0000 0001(十进制1,结果正确)
3. 补码(Two’s Complement)
补码是原码/反码的最终优化方案,彻底解决“正负0”和“运算复杂”问题,是现代计算机的标准数值表示方式。
定义
- 正数:与原码、反码完全相同(三码合一)。
- 负数:反码 + 1(符号位参与运算,若加1后产生进位则直接丢弃)。
示例(8位系统,以-5为例)
- 先求-5的原码:
1000 0101 - 再求-5的反码:符号位不变,数值位取反 →
1111 1010 - 补码 = 反码 + 1:
1111 1010 + 1 = 1111 1011
| 十进制数值 | 原码(二进制) | 反码(二进制) | 补码(二进制) |
|---|---|---|---|
| +5 | 0000 0101 | 0000 0101 | 0000 0101 |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -72 | 1100 1000 | 1011 0111 | 1011 1000 |
核心优势
- 唯一的“0”:补码中“-0”被消除(
1000 0000在8位补码中表示-128,而非-0),存储效率更高。 - 加减法统一为加法:无需判断符号,直接用补码相加,硬件设计极大简化。
- 数值范围更大:8位系统中,补码范围为
-128 ~ +127(原码/反码为-127 ~ +127)。
4. 原码、反码、补码对比(8位系统)
| 特性 | 原码 | 反码 | 补码(计算机实际使用) |
|---|---|---|---|
| 正数表示 | 符号位0+数值绝对值 | 符号位0+数值绝对值 | 符号位0+数值绝对值 |
| 负数表示 | 符号位1+数值绝对值 | 符号位1+数值位取反 | 反码+1 |
| “0”的表示 | +0(00000000)/-0(10000000) | +0(00000000)/-0(11111111) | 唯一0(00000000) |
| 数值范围 | -127 ~ +127 | -127 ~ +127 | -128 ~ +127 |
| 运算复杂度 | 需判断符号,无法直加 | 需循环进位,较复杂 | 直接相加,无额外操作 |
二、补码运算深度解析
补码的核心价值在于“将减法转为加法”,所有运算均遵循“补码相加 → 处理溢出 → 结果转十进制”的逻辑。以下通过四类典型场景示例说明。
1. 场景1:正数 + 正数(5 + 3)
步骤1:获取两数补码(正数补码=原码)
- 5的补码:
0000 0101 - 3的补码:
0000 0011
步骤2:补码相加
1 | 0000 0101 (5的补码) |
步骤3:补码转十进制
0000 1000 符号位为0(正数),数值位1000=8 → 结果为8(正确)。
2. 场景2:正数 + 负数(5 - 3 = 5 + (-3))
步骤1:获取两数补码
- 5的补码:
0000 0101(正数补码=原码) - -3的补码:原码
1000 0011→ 反码1111 1100→ 补码1111 1101
步骤2:补码相加(高位溢出丢弃)
1 | 0000 0101 (5的补码) |
步骤3:补码转十进制
0000 0010 符号位为0,数值位0010=2 → 结果为2(正确)。
3. 场景3:负数 + 负数(-5 + (-3))
步骤1:获取两数补码
- -5的补码:
1111 1011 - -3的补码:
1111 1101
步骤2:补码相加(高位溢出丢弃)
1 | 1111 1011 (-5的补码) |
步骤3:补码转十进制(负数补码需逆推)
- 补码
1111 1000→ 反码 = 补码 - 1 →1111 0111 - 原码 = 符号位不变,数值位取反 →
1000 1000(数值位1000=8) - 结果为-8(正确)。
4. 场景4:补码溢出(8位系统,127 + 1)
当运算结果超出补码表示范围时,会产生溢出,导致结果错误,需特别注意。
步骤1:获取两数补码
- 127的补码(8位):
0111 1111(8位正数最大值) - 1的补码:
0000 0001
步骤2:补码相加
1 | 0111 1111 (127的补码) |
步骤3:判断溢出与结果
- 8位补码中
1000 0000表示-128,而非128(超出范围) → 溢出错误。 - 溢出判断规则:符号位的进位(C1)与最高数值位的进位(C2)不同时,即为溢出(本例中C1=0,C2=1,C1≠C2 → 溢出)。
三、字符表示与编码体系
数值之外,计算机还需表示字符(字母、数字、符号等),编码是“字符→二进制”的映射规则。ASCII是基础,Unicode/UTF-8是解决多语言问题的扩展方案。
1. ASCII码(基础字符编码)
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是1963年制定的通用字符编码,仅支持英文及基础符号,是现代编码的基石。
核心特性
- 7位编码:用7位二进制表示字符,共
2^7=128个字符(十进制0~127)。 - 1字节存储:实际存储时占用1字节(8位),最高位固定为0(预留扩展空间)。
- 编码范围:十进制0
127、十六进制007F、二进制00000000~01111111。
ASCII码表结构(按功能分类)
(1)控制字符(十进制0~31、127)
用于控制设备(如打印机、终端),不可打印,常见如下:
| 十进制 | 十六进制 | 缩写 | 含义 | 常用场景 |
|---|---|---|---|---|
| 0 | 00 | NUL | 空字符 | 初始化内存、字符串结束 |
| 7 | 07 | BEL | 响铃 | 错误提示(蜂鸣) |
| 8 | 08 | BS | 退格键(Backspace) | 删除光标前字符 |
| 9 | 09 | HT | 水平制表符(Tab) | 文本缩进 |
| 10 | 0A | LF | 换行(Line Feed) | Unix/Linux换行符 |
| 13 | 0D | CR | 回车(Carriage Return) | Windows换行符(CR+LF) |
| 27 | 1B | ESC | 退出/取消 | 终端命令中断 |
| 127 | 7F | DEL | 删除键(Delete) | 删除光标后字符 |
(2)可打印字符(十进制32~126)
包含空格、数字、字母、符号,共95个,按功能分区:
| 字符类型 | 十进制范围 | 十六进制范围 | 示例字符 |
|---|---|---|---|
| 空格 | 32 | 20 | (无可见字符,文本分隔) |
| 特殊符号1 | 33~47 | 21~2F | ! “ # $ % & ‘ ( ) * + , - . / |
| 数字 | 48~57 | 30~39 | 0 1 2 3 4 5 6 7 8 9 |
| 特殊符号2 | 58~64 | 3A~40 | : ; < = > ? @ |
| 大写字母 | 65~90 | 41~5A | A B C … Z |
| 特殊符号3 | 91~96 | 5B~60 | [ \ ] ^ _ ` |
| 小写字母 | 97~122 | 61~7A | a b c … z |
| 特殊符号4 | 123~126 | 7B~7E | { |
常用ASCII码值速查表
| 字符 | 十进制 | 二进制 | 十六进制 | 备注 |
|---|---|---|---|---|
| (空格) | 32 | 00100000 | 20 | 唯一不可见的可打印字符 |
| 0 | 48 | 00110000 | 30 | 数字字符起始 |
| A | 65 | 01000001 | 41 | 大写字母起始 |
| a | 97 | 01100001 | 61 | 小写字母起始(A+32) |
| @ | 64 | 01000000 | 40 | 大写字母前的符号 |
| ! | 33 | 00100001 | 21 | 特殊符号起始 |
| \n | 10 | 00001010 | 0A | 换行符(LF) |
| \r | 13 | 00001101 | 0D | 回车符(CR) |
2. 编码扩展:从ASCII到UTF-8
ASCII仅支持英文,无法满足中文、日文、阿拉伯文等多语言需求,因此诞生了扩展编码体系。
(1)扩展ASCII(8位ASCII)
- 利用ASCII预留的“最高位”(原固定为0),将编码扩展为8位,支持
2^8=256个字符(十进制0~255)。 - 范围128~255用于表示西欧语言(如法语é、德语ü),但仍无法支持中文等复杂文字。
(2)Unicode与UTF-8
- Unicode:又称“统一码”,为全球所有文字(包括中文、日文、 emoji)分配唯一的“码点”(如“中”的码点是
U+4E2D),解决“编码碎片化”问题。 - UTF-8:Unicode的“实现方式”(编码方案),采用可变长字节存储:
- 英文/数字:1字节(与ASCII完全兼容,最高位0)。
- 中文/日文:2~3字节。
- 特殊符号(如emoji):4字节。
- 优势:兼容ASCII、节省存储空间,是当前互联网和软件的主流编码。
(3)常见编码对比
| 编码标准 | 覆盖范围 | 存储方式 | 兼容性 | 应用场景 |
|---|---|---|---|---|
| ASCII | 英文、基础符号 | 1字节(7位) | 全球兼容 | 早期系统、纯英文文档 |
| 扩展ASCII | 西欧语言 | 1字节(8位) | 不兼容多语言 | 西欧地区文档 |
| GB2312 | 中文(6763个) | 1~2字节 | 兼容ASCII,仅支持中文 | 早期中文Windows系统 |
| UTF-8 | 全球所有文字 | 1~4字节(可变) | 兼容ASCII,多语言兼容 | 互联网、现代软件、网页 |
四、关键注意事项
位数影响数值范围:
补码的数值范围由“位数”决定,如32位系统中补码范围为-2^31 ~ 2^31 - 1(约-21亿+21亿),远超8位系统的`-128+127`。ASCII扩展位的作用:
标准ASCII最高位为0,扩展ASCII(128~255)将最高位置1,但不同厂商定义不同(如IBM扩展ASCII与微软不同),导致兼容性问题,最终被UTF-8取代。补码运算的核心原则:
- 无论正负,运算均为“补码相加”。
- 高位溢出直接丢弃(因补码的“模运算”特性,丢弃后结果仍正确,除非溢出)。
- 负数补码转十进制需“逆推”(补码-1→反码→原码)。
五、总结
计算机对数据的表示本质是“二进制映射”:
- 数值:通过补码解决正负表示与运算复杂的问题,是硬件运算的基础。
- 字符:从ASCII的英文局限,演进到UTF-8的全球多语言兼容,核心是平衡“兼容性”与“覆盖范围”。
理解这些底层逻辑,能帮助我们解决实际问题(如乱码、数值溢出错误),也是深入学习计算机原理(如CPU运算、文件存储)的关键前提。









