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

Printing using hexadecimal format specifier

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

#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)不指向同一个地址吗?

*q++*(q + 1) 在表达式中计算它们的值时不指向相同的内存位置。 *q++ 将指向表达式计算后 q 之后的下一个内存位置。

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