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

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

计算机以二进制(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))
  1. 3的反码:0000 0011
  2. -2的反码:1111 1101
  3. 反码相加:0000 0011 + 1111 1101 = 1 0000 0000(最高位产生进位1)
  4. 循环进位:将进位1加到最低位 → 0000 0000 + 1 = 0000 0001(十进制1,结果正确)

3. 补码(Two’s Complement)

补码是原码/反码的最终优化方案,彻底解决“正负0”和“运算复杂”问题,是现代计算机的标准数值表示方式

定义

  • 正数:与原码、反码完全相同(三码合一)。
  • 负数:反码 + 1(符号位参与运算,若加1后产生进位则直接丢弃)。

示例(8位系统,以-5为例)

  1. 先求-5的原码:1000 0101
  2. 再求-5的反码:符号位不变,数值位取反 → 1111 1010
  3. 补码 = 反码 + 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
2
3
  0000 0101  (5的补码)
+ 0000 0011 (3的补码)
= 0000 1000 (无进位,结果补码)

步骤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
2
3
4
  0000 0101  (5的补码)
+ 1111 1101 (-3的补码)
= 1 0000 0010 (最高位产生进位1,直接丢弃)
→ 0000 0010 (最终结果补码)

步骤3:补码转十进制

0000 0010 符号位为0,数值位0010=2 → 结果为2(正确)。

3. 场景3:负数 + 负数(-5 + (-3))

步骤1:获取两数补码

  • -5的补码:1111 1011
  • -3的补码:1111 1101

步骤2:补码相加(高位溢出丢弃)

1
2
3
4
  1111 1011  (-5的补码)
+ 1111 1101 (-3的补码)
= 1 1111 1000 (最高位进位1,丢弃)
→ 1111 1000 (最终结果补码)

步骤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
2
3
  0111 1111  (127的补码)
+ 0000 0001 (1的补码)
= 1000 0000 (结果补码)

步骤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(预留扩展空间)。
  • 编码范围:十进制0127、十六进制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,多语言兼容 互联网、现代软件、网页

四、关键注意事项

  1. 位数影响数值范围
    补码的数值范围由“位数”决定,如32位系统中补码范围为-2^31 ~ 2^31 - 1(约-21亿+21亿),远超8位系统的`-128+127`。

  2. ASCII扩展位的作用
    标准ASCII最高位为0,扩展ASCII(128~255)将最高位置1,但不同厂商定义不同(如IBM扩展ASCII与微软不同),导致兼容性问题,最终被UTF-8取代。

  3. 补码运算的核心原则

    • 无论正负,运算均为“补码相加”。
    • 高位溢出直接丢弃(因补码的“模运算”特性,丢弃后结果仍正确,除非溢出)。
    • 负数补码转十进制需“逆推”(补码-1→反码→原码)。

五、总结

计算机对数据的表示本质是“二进制映射”:

  • 数值:通过补码解决正负表示与运算复杂的问题,是硬件运算的基础。
  • 字符:从ASCII的英文局限,演进到UTF-8的全球多语言兼容,核心是平衡“兼容性”与“覆盖范围”。

理解这些底层逻辑,能帮助我们解决实际问题(如乱码、数值溢出错误),也是深入学习计算机原理(如CPU运算、文件存储)的关键前提。