在32位小端的机器上,如下代码输出是什么?

在32位小端的机器上,如下代码输出是什么:

char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 ,0x07 , 0x08};     
 short *pshort = (short *)array;     
 int *pint = (int *)array;     
 int64 *pint64 = (int64 *)array;     
 printf("0x%x , 0x%x , 0x%llx , 0x%llx", *pshort , *(pshort+2) , *pint64 , *(pint+2));

A: 0x201 , 0x403 , 0x807060504030201 , 0x0
B: 0x201 , 0x605 , 0x807060504030201 , 0x0
C: 0x201 , 0x605 , 0x4030201 , 0x8070605
D: 0x102 , 0x506 , 0x102030405060708 , 0x0

解析;
小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。
pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。
pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。
pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。
pint + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0。

按照入栈的方式,上面是没有错的。 但是 printf 中的 %x 在我测试的系统上只能输出 32 位的值。

在我测试的系统上,printf %x 是不能输出 64 位的值的.

这个 printf 在 gcc 4.8 下是编译不过的。

在 vc 下面没有判断 printf 对应的参数类型,压入 pint64 时入栈 8 个字节,printf 的第3个 %x 显示 pint64 的低32位,第四个 %x 显示 pint64 的高32位,(pint+2)压入栈的数值没有被 printf 抓到。

答案是C。

Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
D:\work\test\dump>foo2
0x201 , 0x605 , 0x4030201 , 0x8070605

gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
foo.cpp: In function ‘int main()’:
foo.cpp:9:81: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘long long int’ [-Wformat=]
printf(“0x%x , 0x%x , 0x%x , 0x%x”, pshort , (pshort+2) , pint64 , (pint+2));

0x201 , 0x605 , 0x4030201 , 0x0

你可能感兴趣的:(C/C++)