使用十六进制格式说明符打印
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
并查看是否得到预期结果。
为什么给定的代码给出以下输出。
#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
并查看是否得到预期结果。