使用十六进制格式说明符打印

时间:2015-10-03 10:27:24

标签: c hex printf

为什么给定的代码会提供以下输出。

#include <stdio.h>
int main(void) 
{
    int x = 0x12345678;
    unsigned short *p = &x;
    unsigned char *q = &x;
    printf("%x %x\n",*p++,*p++);
    printf("%x %x %x %x\n",q[0],q[1],q[2],q[3]);
    return 0;
}

输出:

1234 5678
78 56 34 12

而不是:

1234 5678
12 34 56 78

我觉得可能是答案的结果是架构的结尾必然导致它。但我无法理解如何,因为整个4-byte必须以连续的方式存储。

也不是*q++*(q+1)指向同一地址?

1 个答案:

答案 0 :(得分:1)

在评估表达式中的值时,

*q++*(q + 1)未指向相​​同的内存位置。在评估表达式后,*q++将指向q之后的下一个内存位置。

你得到78 56 34 12而不是12 34 56 78的原因与字节序有关;在内存中,int可能会存储为78563412。尝试用x & 0xff, (x >> 8) & 0xff, (x >> 16) & 0xff, (x >> 24) & 0xff替换printf语句中的q [0]到q [3],看看你是否得到了预期的结果。