C 语言中字符串被编码为一个以 null( 其值为 0) 字符结尾的字符数组,每个字符都由某个标准编码来表示,最常见的是 ASCII 字符码。因此,如果我们以参数 "12345" 和 6(包括终止符)来运行例程 show_bytes,我们得到结果 31 32 33 34 35 00。请注意,十进制数字 x 的 ASCII 码正好是 Ox3x,而终止字节的十六进制表示为 Ox00。在使用 ASCII 码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关 因而,文本数据比二进制数据具有更强的平台独立性。
考虑下面的 C 函数:
int sum(int x, int y) {
return x + y;
}
当我们在示例机器上编译时,生成如下字节表示的机器代码:
- Linux 32: 55 89 e5 Sb 45 Oc 03 45 08 c9 c3
- Windows:55 89 e5 Sb 45 Oc 03 45 08 5d c3
- Sun: 81 c3 eO 08 90 02 00 09
- Linux 64: 55 48 89 e5 89 7d fc 89 75 f8 03 45 fc c9 c3
我们发现指令编码是不同的。不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程,运行在不同的操作系统上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同机器和操作系统组合之间移植。
计算机系统的一个基本概念就是,从机器的角度来看,程序仅仅只是字节序列。机器没有关于原始源程序的任何信息,除了可能有些用来帮助调试的辅助表以外。在第 3 章学习机器级编程时,我们将更清楚地看到这一点。
网友评论