【信奥业余科普】03:计算机的数据表示,从 0 和 1 到大千世界
第三篇信奥基础知识科普:了解计算机底层是如何用简单的 0 和 1 来表示文字、图像和声音的,带你揭开数字化社会的底层秘密。
写在前面的话:这是一系列专为对信奥(信息学奥赛)感兴趣的中小学生及家长朋友们准备的业余科普文章。笔者并非计算机历史学专家,受自身学识所限,文中若存在不严谨或考证疏漏之处,还望各位读者海涵并指正。
推出本系列的初衷主要有三点:
- 拓宽视野:在动手敲代码之前,全面了解计算机软硬件的发展脉络。
- 激发兴趣:通过深入浅出地讲述前沿技术与历史故事,希望能点燃中小学生对计算机科学的好奇心。
- 课余读物:哪怕只是作为打发闲暇时光的休闲阅读,也能让大家在轻松的氛围中收获知识。
本系列文章往期回顾:
一、 数字化社会的地基:为什么只有 0 和 1?
在上一篇文章中我们讲到,冯·诺依曼确立了现代计算机硬件的“二进制”基因。你手里拿的手机、家里用的电脑,甚至是那些算力巨大的超级机器,它的物理底层并不认识什么英文字母、汉字或者短视频,它只认识两种电信号:高电平和低电平。
在逻辑上,我们把高电平记作 1,低电平记作 0。 这两种状态就是计算机世界里最基本的单位,被称为 比特 (Bit)。
可是,这个世界是丰富多彩的,单凭 0 和 1 这两个干瘪的数字,到底是怎么描绘出大千世界的呢?这就是我们今天要讲的“抽象编码魔法”。
二、 从电报密码到字符编码:让机器读懂英文
其实,“用有限的信号来表示无限的意义”这个想法,早在计算机发明之前就已经有了。
大家在电影里肯定见过摩尔斯电码 (Morse Code)。发报员通过控制电报机,敲出“滴”(短信号)和“答”(长信号)两种声音组合,就能传递出完整的英文情报。比如“滴-答”(短-长)代表字母 A,“答-滴-滴-滴”(长-短-短-短)代表字母 B。
计算机处理英文字符的逻辑与摩尔斯电码如出一辙,只不过它用的是 0 和 1。 由于英文的字母数量有限(26个大写字母、26个小写字母、10个数字加上一些标点符号,总共也就100来个),工程师们很快就制定了一套标准的“密码本”。
在这个名为 ASCII (美国信息交换标准代码) 的密码本中,规定了用 8个比特(相当于8个极细微的0或1的状态组合,也称为1个字节 Byte) 来表示一个字符。
- 比如大写字母
A,在密码本里对应的编号是 65,换算成二进制就是01000001。 - 小写字母
a,对应的编号是 97,二进制是01100001。 - 数字符号
1,对应的编号是 49,二进制是00110001。
当你在键盘上敲下一个 A 时,键盘就会向计算机发送一串 01000001 的数据。
在物理层面上,这具体是怎么发送的呢? 让我们呼应一下第一节提到的“高低电平”概念。 不论你使用的是有线键盘还是无线蓝牙键盘,当你按下 A 键的瞬间,键盘内部的微小芯片就会在极短的时间内,按照固定的节奏,依次发出 8 个电压脉冲信号:“低电平-高电平-低电平-低电平-低电平-低电平-低电平-高电平”(完美对应 0-1-0-0-0-0-0-1)。
电脑主板接收到这串如同摩尔斯电码般的“低高低低低低低高”的物理电信号后,立刻将其在内存中还原成了抽象的二进制数字 01000001。接着,CPU 去查了一下内置的 ASCII 密码本,恍然大悟:“哦!主人敲的是大写字母 A!”最后,它控制显卡,在屏幕上把这个字母画了出来。
考试相关:在 GESP 和 CSP 的初赛中,ASCII 码表是必考内容。在GESP二级考纲中有明确要求。
三、 从英文到全球语言:汉字怎么存?
ASCII 码表虽然好用,但它最初是美国人发明的,最多只能表示 256 种符号。要想把成千上万个汉字、繁体字,甚至全世界的语言符号(如日文、俄文、阿拉伯文,甚至手机里的 Emoji 表情)都塞进去,显然是远远不够的。
怎么办?既然 8 个 0和1(1个字节)不够,那我们就多加几位!
为了解决这个问题,世界各国开始“各自为战”,纷纷发明了自己的局部“密码本”。比如中国科学家就发明了专门的中文编码(如 GB2312 及其扩展版 GBK),用两个字节(16个比特)来单独表示一个汉字。
但这很快带来了严重的问题——“信息孤岛”与“乱码”。因为各国用的密码本互不相通,一段在日本电脑上遵循日文编码(如 Shift-JIS)的邮件,发到中国电脑上,如果被中国电脑用 GBK 密码本去强行解码查表,就会变成一堆张牙舞爪、完全看不懂的乱码。
为了让全世界的语言能在同一台计算机上和平共处、互通有无,国际标准化组织出面制定了一个终极的“超级大字典”——Unicode(万国码)。
在这里,很多同学容易混淆两个关键概念,我们要稍微做一点拆解区分:
- “字符集(密码本)”: 也就是 Unicode 本身。它就像一本涵盖地球上所有已知语言符号(包括日文、俄文,甚至手机里的 Emoji 表情)的究极大字典。它强行给每一个字符都分配了一个在全世界绝无仅有、永远固定的数字编号。
- “编码方式(怎么翻字典)”: 比如著名的 UTF-8 编码。虽然字都有了编号,但如果要在硬盘上原封不动地存储这些编号,像 Emoji 这种编号极大的符号需要耗费很多个字节。为了不让那些只用了普通英文字母的极其巨大的文本文件因此浪费好几倍的存储空间,UTF-8 发明了一种极其聪明的“见人下菜碟”的动态存储法:它遇到最普遍的英文字母,只用 1 个字节去存;遇到稍微复杂的字符用 2 个;遇到大家常用的汉字通常用 3 个字节;而遇到复杂的 Emoji 可能才动用 4 个字节。
简单来说,它们的关系是“灵魂”与“肉体”的关系: 字符集(Unicode)只是一个纯粹的数学概念,规定了“汉字『中』对应编号 20013”;而编码方式(UTF-8)是这个概念在计算机物理硬件上的具体落地,规定了“编号 20013 的字,到底要切碎成几个 0 和 1 去塞进内存条的微小晶体管里”。一个负责“编排定义”,一个负责“物理收纳”。
💡 举个直观的例子:同一个字符,不同的编码
假设我们要向电脑存入同一个汉字——“信”。
- 第一步查字符集(Unicode 全球字典):规定了“信”字的全国统一编号是 20449(十六进制
4FDF)。- 第二步看你选哪种编码方式(怎么装进硬盘的收纳盒):
- 如果系统采用 UTF-8(变长型):电脑会用一种特殊的数学转换算法,把 20449 强行切分成 3个 独立的字节存进硬盘(
11100100 10111111 10011111即E4 BF 9F)。- 如果系统采用 UTF-16(双定长型):电脑直接将其转换成 2个 字节存进硬盘(
01001111 11011111即4F DF)。- 如果系统采用 UTF-32(固定大箱子):不管你的字多简单,它一律发一个巨无霸箱子,用整整 4个 字节存进去(
00000000 00000000 01001111 11011111即00 00 4F DF)。
从 ASCII 的狭隘,到各国各自定义编码集的军阀混战,再到 Unicode 和 UTF-8 的大一统,正是因为有了这个不断升级、最终统一的数字化约定,我们用 C++ 写的代码才跨越了国界的局限,全球的互联网也才得以真正无障碍地连通。
四、 万物皆可数字化:图像与声音的秘密
讲完了文字,那么电脑里绚丽多彩的游戏画面、动听的 MP3 音乐,又是怎么变成 0 和 1 的呢?
这里面用到了一种叫 采样 (Sampling) 和 量化 (Quantization) 的抽象映射技术。
1. 拆解图像:像素点的矩阵
你凑到显示器或者电视机屏幕的最前面,用放大镜仔细看,你会发现屏幕其实是由无数个发光的小彩点组成的。每一个这样的小彩点,就叫作一个 像素 (Pixel)。
一幅高清图片,本质上就是一张记录着几百万个像素点颜色信息的巨大表格。 计算机把红、绿、蓝三种发光颜色(RGB三原色)按照不同比例混合,就能调配出我们肉眼能看到的所有颜色。只要计算机记录下图片每个像素点上这三个原色的比例(比如分别用 0~255 的数字来刻画深浅),一张色彩斑斓的图谱自然就变成了一大串由 0 和 1 组成的神奇数据序列。
2. 切割声音:捕捉声波的曲线
现实物理世界里的声音是连续起伏的波浪(声波)。为了把声音存进电脑,工程师们想出了一个绝招:既然声音是曲线,那我就每隔极其微小的一段时间(比如每秒钟连续切片并记录 44100 次,即 44.1kHz 的采样率),去精准测量一下这条声波的高度,并记录成一个具体数字。
虽然这种切片记录在物理上是不连续的,但由于间隔实在太短了,当计算机将这些按顺序记录下的数字飞速连缀起来转化成声音播放时,我们这一双“迟钝”的人类耳朵,便听到了一首行云流水、没有任何卡顿的连续音乐。
💡 衍生思考:采样率与音质的关系
既然是“切片”,就必然会漏掉切片之间的微小细节(这被称为数字化损耗)。因此,采样率越高(每秒切的片数越多),计算机记录下的声音曲线就越逼近真实世界的原始声波,音质就越好,听起来越保真。
但代价也是显而易见的:一秒钟切 44100 片(CD音质)和一秒钟切 192000 片(Hi-Res 甚至母带级音质),后者需要极其庞大的 0 和 1 去记录数据,这会导致一首相同长度的歌曲,文件体积大出好几倍甚至十几倍。这也就是为什么在线听高品质无损音乐会更消耗手机流量的原因。
3. 连载成画的魔法:视频又是什么?
当我们明白了图片和声音的存储原理后,视频的诞生就顺理成章了。
视频,本质上就是“以极快速度连续播放的图片序列” 加上 “一条同步的声音轨迹”。
你平时看动画片或翻页小人书时应该有个直观的感受:当画面一页页快速翻动时,静止的图画就在人眼(视觉暂留原理)中“动”起来了。 在计算机中,我们把每一张静止的图片称为一 “帧”(Frame)。
- 电影通常是每秒播放 24 帧(即 24 fps)。
- 我们平时玩的流畅 3D 游戏或看的高清视频,通常追求每秒 60 帧(60 fps)。
这就意味着,你在手机上看的一段1分钟的 60 帧短视频,电脑底层其实是在以极快的速度,给你连续画出了 $60 \times 60 = 3600$ 张高清图片,同时耳朵里还同步播放着经过切片量化的声波数据。
当然,如果真把几千张高清图片的 0 和 1 原封不动地存下来,一部电影的体积会大到连如今顶配的硬盘都装不下。因此,科学家们又发明了各种极其精妙的“视频压缩算法”(例如常听说的 H.264、H.265 等),专门用来剔除画面中多余或重复的像素点,这才让我们今天能够如此顺畅地刷短视频、看电影。
小结:0 和 1 构筑的平行宇宙
文字被“密码本”转换查表映射; 图片被切碎成了无数个用来勾勒颜色的细微方块; 声音被量尺像切肉片一样进行了精准的时间截断记录。 视频则是由无数张图片和声音的片段快速连缀而成。
在这个只有 0 和 1 的冰冷世界里,人类硬是凭借着天才般的抽象逻辑与规则编码能力,重新构建出了一个比真实物理世界更加多姿多彩、光怪陆离的数字化平行宇宙。而在未来,同学们将要在信奥中掌握的 C++ 编程语言,正是你们向这个底层架构下发指令的魔法。
下期预告
我们已经了解了硬件的基础架构,也破译了数据表达的秘密。但早期的机器如 ENIAC 犹如一栋塞满几万只发烫玻璃灯泡的房子,它究竟经历了怎样的物理魔幻微缩,才变成了今天我们每天捧在手心里的轻薄智能芯片?
下一期,我们将探讨这不可思议的硬件微缩之路:《【信奥业余科普】04:造物的奇迹,四代计算机的硬件狂奔》。
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
