文章目录
- 线索栏
- 笔记栏
-
- 2.1.4 表示字符串
-
- 1.编码方式
- 2.示例分析
- 3.平台独立性
- 4.练习题2.7解答
- 5.旁注:Unicode标准
- 2.1.5 表示代码
-
- 1.核心现象
-
- 1)示例函数
- 2)编译结果(十六进制机器码)
- 2.重要结论
- 3.根本观点
- 总结栏
线索栏
笔记栏
2.1.4 表示字符串
1.编码方式
(1)C语言中的字符串被编码为一个以 null(值0) 字符结尾的字符数组。 (2)每个字符由标准编码(如 ASCII)表示。
2.示例分析
(1)字符串 “12345”(包括终止符)的字节表示为:31 32 33 34 35 00。 (2)规律:十进制数字字符 ‘x‘的ASCII码正好是 0x3x。
3.平台独立性
(1)文本数据(字符串)比二进制数据平台独立性更强。 (2)原因:字符编码(如ASCII)是跨平台标准,不受机器字节顺序和字大小的影响。
4.练习题2.7解答
(1)const char *s = “abcdef”; (2)show_bytes((byte_pointer)s, strlen(s));// strlen不计算终止符 \\0 (3)输出将是字母 ‘a‘到 ‘f‘的ASCII码:61 62 63 64 65 66。 
5.旁注:Unicode标准
(1)背景:ASCII编码无法满足多语言需求(如希腊语、中文)。 (2)Unicode:统一的字符集标准,为几乎所有语言的字符分配唯一编码(码点)。 (3)UTF-8:一种变长编码,是Unicode的一种实现方式。 关键优势:完全向后兼容ASCII。标准ASCII字符在UTF-8中仍用单字节表示,且编码值完全相同。
2.1.5 表示代码
1.核心现象
同一个简单的C函数在不同机器和操作系统上编译,生成完全不同的机器代码字节序列。
1)示例函数
int sum(int x, int y) {
return x + y;
}
2)编译结果(十六进制机器码)
(1)Linux 32: 55 89 e5 8b 45 0c 03 45 08 c9 c3 (2)Windows: 55 89 e5 8b 45 0c 03 45 08 5d c3 (3)Sun: 81 c3 e0 08 90 02 00 09 (4)Linux 64: 55 48 89 e5 89 7d fc 89 75 f8 03 45 fc c9 c3
2.重要结论
(1)指令集差异:不同机器类型使用不兼容的指令和编码方式。 (2)系统调用差异:相同处理器在不同操作系统上可能有不同的应用程序二进制接口(ABI),影响编码。 (3)二进制代码不可移植:编译后的程序通常不能在机器和操作系统的其他组合上运行。
3.根本观点
对机器而言,程序仅仅是一个字节序列。 机器对源代码的逻辑一无所知。这是“信息就是位+上下文”的绝佳例证——相同的源代码位(逻辑),在不同的编译上下文(目标机器和操作系统)下,被解释为完全不同的机器指令(位模式)。
总结栏
本节对比了两种关键信息的表示:
理解字符串的表示是进行文件处理、网络通信的基础;而理解机器代码的表示差异,则是认识操作系统移植性、软件分发格式(如源码分发 vs. 二进制分发)以及后续学习编译、链接和机器级编程(第3章) 的重要前提。练习题2.7则是一个简单的实践,将字符串理论知识与之前学习的 show_bytes工具联系起来。
网硕互联帮助中心


评论前必须登录!
注册