【发布时间】:2021-10-19 07:13:06
【问题描述】:
我有一个小sn-p:
int main()
{
unsigned long long x = 0x0000000000008342;
unsigned long long * x_p = &x;
unsigned int * y_p = (unsigned int *)x_p;
unsigned int y = *y_p;
printf("y = %#.8x\n", y);
}
使用 little endian,这就是数字的存储方式。
0x00: 42 83 00 00
0x04: 00 00 00 00
但是为什么打印的是 0x00008342 而不是 0x00004283 呢?
【问题讨论】:
-
唯一存储在内存中的值是
a初始化的值。编译器不会存储像0x7788aabb这样的整数文字。并且当您在初始化中截断位数时,只会存储0x0000aabb。 -
还要注意这里不涉及字节序,无论字节序如何,转换都会截断为最低 16 位。而这 16 个最低位将永远是
0xaabb。 -
a的值在 16 位 int 的机器上可能不同 -
您在 C 中用于整数的表示法不依赖于您使用的硬件上的字节序类型。在 C 中将 long 截断为 short 也不取决于硬件上的字节序类型。如果您获取一个整数的地址,并访问它所包含的字节,那么这很重要。
-
我不确定是什么让您感到困惑。您似乎很清楚,在小端机器上写入期间,最低有效字节到达最低地址。美好的。那么,为什么您会惊讶于在读取过程中从最低地址读取最低有效字节。我的意思是这是一个对称操作。