发布网友 发布时间:2024-10-24 12:57
共1个回答
热心网友 时间:2024-10-29 13:46
观察下面的C源程序endian.c,思考以下三个问题。
(1) 上述代码中,变量x、y和z的值都是100。在该程序运行过程中,x、y和z存储的机器数是一样的吗?占用的存储空间也是一样的吗?
(2) 变量d的机器数为0x12345678,为什么在存储器中看到的是“0x78 0x56 0x34 0x12”,好像倒过来的顺序?
(3) 语句“int d=0x12345678;”对应的机器指令为“c7 45 f4 78 56 34 12”,若将该语句修改为“int d=0x22334455;”,能写出其对应的机器指令吗?
数据存储的宽度取决于C语言中数值数据类型的宽度。C语言支持多种格式的整数和浮点数表示,如char、short和int类型。
整数100的十六进制表示为64H,由于x、y、z的数据类型不同,它们在程序运行时占用的存储空间大小不一样,机器数有差别。查看变量x、y和z在运行时存储的内容需要调试执行程序,这需要熟悉汇编指令。
通过反汇编文档,可以找到初始化变量的机器级指令。以变量x、y、z和d的初始化为例,可以看到整型变量的初始化可以通过mov指令实现。mov指令的第一参数表示源数据,第二参数表示目的地址。
理解图1中的反汇编文档,可以查看变量x、y、z、d存储的内容。调试执行指令时,能从这些地址中查看变量的机器数。使用gdb调试工具来调试执行程序,加载程序、设置断点、运行程序,可以观察变量内容的变化。
总结一下:通过程序的调试执行,虽然C源程序中,x、y、z的值都是100,但x、y和z的数据类型不一样,不同的数据类型有不同的数据宽度。d的机器数是0x12345678,它的存储顺序与C语言中的字节顺序相关,即大端或小端方式。
在大端方式中,最高有效字节存放在低地址单元中,最低有效字节存放在高地址单元中。数据d的最高有效字节是0x12,最低有效字节是0x78。在小端方式中,最高有效字节存放在高地址单元中,最低有效字节存放在低地址单元中。
系统之间进行通信时需要考虑数据的排列顺序问题。网络应用程序员必须遵循字节顺序的规则,确保发送方计算机将它的内部表示转换为网络标准,接收方计算机将网络标准转换为自己内部的表示格式。不同计算机系统内部的数据排列顺序不同,大多数Intel兼容的计算机采用小端方式,而IBM和Oracle的大多数计算机采用大端方式。音频、视频和图像等文件格式或处理程序也会涉及字节顺序问题。
在机器指令中,数据的字节顺序同样重要。例如,图1中,x、y、z和d的初始化语句对应的机器指令中,把100的机器数0x64、0x0064、0x0000 00064,以及0x12345678都当作立即数放在指令中,0x0064、0x0000 00064、0x12345678就有字节顺序问题了。若将语句“int d=0x12345678;”修改为“int d=0x22334455;”,对应的机器指令为“C7 45 D4 55 44 33 22”。修改该语句后的反汇编文档如图4所示。
了解数据存储的宽度和存储的排列顺序是重要的基础知识点,大多数应用程序员感觉不到,若不了解这些,则一些问题难以发现。例如,给定一个C程序,可以检测计算机是采用大端方式还是小端方式。总结:正确理解数据存储的宽度和排列方式对于编写高效、兼容的代码至关重要。