重学计算机组成原理(十)- "烫烫烫"乱码的由来(下)

简介: 重学计算机组成原理(十)- "烫烫烫"乱码的由来(下)

2 字符串的表示,从编码到数字

不仅数值可以用二进制表示,字符乃至更多的信息都能用二进制表示

最典型的例子就是字符串(Character String)

最早计算机只需要使用英文字符,加上数字和一些特殊符号,然后用8位的二进制,就能表示我们日常需要的所有字符了,这个就是我们常常说的ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)

image.png

ASCII码就好比一个字典,用8位二进制中的128个不同的数,映射到128个不同的字符里


比如,小写字母a在ASCII里面,就是第97个,也就是二进制的0110 0001,对应的十六进制表示就是 61。而大写字母 A,就是第65个,也就是二进制的0100 0001,对应的十六进制表示就是41。


在ASCII码里面,数字9不再像整数表示法里一样,用0000 1001来表示,而是用0011 1001 来表示。字符串15也不是用0000 1111 这8位来表示,而是变成两个字符1和5连续放在一起,也就是 0011 0001 和 0011 0101,需要用两个8位来表示。


我们可以看到,最大的32位整数,就是2147483647。如果用整数表示法,只需要32位就能表示了。但是如果用字符串来表示,一共有10个字符,每个字符用8位的话,需要整整80位。比起整数表示法,要多占很多空间。


这也是为什么,很多时候我们在存储数据的时候,要采用二进制序列化这样的方式,而不是简单地把数据通过CSV或者JSON,这样的文本格式存储来进行序列化。不管是整数也好,浮点数也好,采用二进制序列化会比存储文本省下不少空间。


ASCII码只表示了128个字符,一开始倒也堪用,毕竟计算机是在美国发明的

然而随着越来越多的不同国家的人都用上了计算机,想要表示譬如中文这样的文字,128个字符显然是不太够用的。于是,计算机工程师们开始各显神通,给自己国家的语言创建了对应的字符集(Charset)和字符编码(Character Encoding)


字符集

表示的可以是字符的一个集合

比如“中文”就是一个字符集,不过这样描述一个字符集并不准确

想要更精确一点,我们可以说,“第一版《新华字典》里面出现的所有汉字”,这是一个字符集。这样,我们才能明确知道,一个字符在不在这个集合里面

比如,我们日常说的Unicode,其实就是一个字符集,包含了150种语言的14万个不同的字符。

字符编码

则是对于字符集里的这些字符,怎么一一用二进制表示出来的一个字典

我们上面说的Unicode,就可以用UTF-8、UTF-16,乃至UTF-32来进行编码,存储成二进制。所以,有了Unicode,其实我们可以用不止UTF-8一种编码形式,我们也可以自己发明一套 GT-32 编码,比如就叫作Geek Time 32好了。只要别人知道这套编码规则,就可以正常传输、显示这段代码。


image.png

image.png

同样的文本,采用不同的编码存储下来。如果另外一个程序,用一种不同的编码方式来进行解码和展示,就会出现乱码。这就好像两个军队用密语通信,如果用错了密码本,那看到的消息就会不知所云。在中文世界里,最典型的就是“手持两把锟斤拷,口中疾呼烫烫烫”的典故。


没有经验的同学,在看到程序输出“烫烫烫”的时候,以为是程序让CPU过热发出报警,于是尝试给CPU降频来解决问题。


既然今天要彻底搞清楚编码知识,我们就来弄清楚“锟斤拷”和“烫烫烫”的来龙去脉。

“锟斤拷”的来源

如果我们想要用Unicode编码记录一些文本,特别是一些遗留的老字符集内的文本,但是这些字符在Unicode中可能并不存在。于是,Unicode会统一把这些字符记录为U+FFFD这个编码

如果用UTF-8的格式存储下来,就是\xef\xbf\xbd。如果连续两个这样的字符放在一起,\xef\xbf\xbd\xef\xbf\xbd,这个时候,如果程序把这个字符,用GB2312的方式进行decode,就会变成“锟斤拷”。这就好比我们用GB2312这本密码本,去解密别人用UTF-8加密的信息,自然没办法读出有用的信息。


而“烫烫烫”,则是因为如果你用了Visual Studio的调试器,默认使用MBCS字符集

“烫”在里面是由0xCCCC来表示的,而0xCC又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,电脑就开始大叫“烫烫烫”了。

3 总结延伸

到这里,相信你发现,我们可以用二进制编码的方式,表示任意的信息。只要建立起字符集和字符编码,并且得到大家的认同,我们就可以在计算机里面表示这样的信息了。所以说,如果你有心,要发明一门自己的克林贡语并不是什么难事。


不过,光是明白怎么把数值和字符在逻辑层面用二进制表示是不够的。我们在计算机组成里面,关心的不只是数值和字符的逻辑表示,更要弄明白,在硬件层面,这些数值和我们一直提的晶体管和电路有什么关系。下一讲,我就会为你揭开神秘的面纱。我会从时钟和D触发器讲起,最终让你明白,计算机里的加法,是如何通过电路来实现的。


4 推荐阅读

《编码:隐匿在计算机软硬件背后的语言》

1.png

  • 从电报机到计算机,这本书讲述了很多计算设备的历史故事,当然,也包含了二进制及其背后对应的电路原理。

参考

  • 深入浅出计算机组成原理
目录
相关文章
|
SQL 存储 数据采集
【技术分享】元数据与数据血缘实现思路
【技术分享】元数据与数据血缘实现思路
8386 0
|
缓存 API 开发工具
几款优秀的点播、RTSP/RTMP直播播放器介绍
介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Android/iOS 视频播放器。实现了跨平台功能,API 易于集成;编译配置可裁剪,方便控制安装包大小;支持硬件加速解码,更加省电;提供 Android 平台下应用弹幕集成的解决方案。
3279 0
|
1月前
|
存储 人工智能 安全
阿里云服务器经济型、通用算力型、计算型热门实例价格、性能对比与选择指南
本文为大家介绍阿里云2核4G、4核8G、8核16G等主流配置的热门实例选型,对比了轻量应用服务器、经济型e、通用算力型u1/u2i、计算型c9i的价格与性能差异。新用户可抢轻量应用服务器2核2G 38元/年、2核4G 199元/年的限量特惠;新老用户同享经济型e 2核2G 99元/年、u1 2核4G 199元/年的长效低价方案。不同实例特性明确:经济型e适合轻量官网,u1适配通用企业应用,u2i算力提升40%,c9i依托CIPU架构与AMX加速面向AI推理等计算密集场景,帮助用户按需匹配最优实例,实现性能与成本平衡。
|
存储 运维 监控
“df -i” 以inode模式来显示磁盘使用情况--这是什么意思?
“df -i” 以inode模式来显示磁盘使用情况--这是什么意思?
1345 0
|
消息中间件 SQL RocketMQ
RocketMQ-初体验RocketMQ(10)-过滤消息_SQL92表达式筛选消息
RocketMQ-初体验RocketMQ(10)-过滤消息_SQL92表达式筛选消息
566 0
|
人工智能 物联网 编译器
《近阈值计算:硬件加速芯片的低功耗密码》
近阈值计算(NTC)技术通过将晶体管工作电压降至接近阈值电压,有效降低功耗并提升芯片性能,成为硬件加速芯片领域的研究热点。NTC优化了电路设计、器件选型和系统级协同设计,采用流水线技术和冗余设计提高稳定性和可靠性。尽管面临性能、稳定性和设计复杂性的挑战,NTC为低功耗高性能芯片提供了新方向,推动人工智能、物联网等领域的发展。
594 15
|
前端开发 Linux 调度
ftrace、perf、bcc、bpftrace、ply的使用
ftrace、perf、bcc、bpftrace、ply的使用
1153 2
|
数据可视化 UED Python
解锁Matplotlib的交互式图表功能
【4月更文挑战第17天】本文介绍了如何使用Matplotlib创建交互式图表,以增强数据探索体验。通过启用交互模式和利用`matplotlib.widgets`模块,可以创建滑动条、按钮等控件来改变图表属性。例如,滑动条可动态调整线宽,按钮用于切换图例显示。此外,还展示了如何使用Dropdown控件动态更新图表数据。掌握这些技巧能提升数据可视化的交互性和用户体验。
|
监控 数据可视化 数据挖掘
数字化转型项目管理:轻松驾驭关键挑战
本文《数字化项目管理:从入门到精通的实践指南》探讨了数字化项目管理的核心要素、常见误区及实战策略。文中介绍了项目管理的目的、SMART原则、瀑布式与敏捷式交付方式的区别,以及项目成功的关键要素,包括风险管理、需求管理、成本控制、质量保障和沟通管理。此外,还讨论了项目管理中的挑战及解决方案,并推荐了一些提升效率的工具。

热门文章

最新文章