字节顺序和位移位问题
Problems with endianness and bit shift
我正在 Mac(应该是小端架构)上用 C 做一些实验,我注意到一个奇怪的事实,试图打印 [= 的低字节和高字节15=] 变量。
使用值 65534(十六进制的 0xFFFE,大端),使用下面的代码,我期望第一个 printf 会打印出来
0xFE FF,而第二个 0XFF FE。
结果反而相反,为什么?
int main(){
uint16_t x=65534;
uint16_t y=htons(x);
printf("%02x %02x\n",((uint8_t*)&x)[0],((uint8_t*)&x)[1]); //prints fe ff
printf("%02x %02x\n\n",((uint8_t*)&y)[0],((uint8_t*)&y)[1]); // prints ff fe
printf("%02x %02x\n",x>>8,(uint8_t)x);//prints ff fe
printf("%02x %02x\n",y>>8,(uint8_t)y);//prints fe ff
return 0;
}
在这个回答中我假设:
- 您代码中的注释是正确的,描述的是实际发生的情况,而不是您想要发生的情况。
- 因此您的问题涉及第二对 printf。
- 您是 运行 基于 Intel 的 Mac(确实是小端)。
C 的位移运算符的结果与字节序无关。如果 x
是一个 uint16_t
,x>>8
总是 return x
的高字节,无论该字节是存储在第一个还是第二个x
的内存表示的字节。
我正在 Mac(应该是小端架构)上用 C 做一些实验,我注意到一个奇怪的事实,试图打印 [= 的低字节和高字节15=] 变量。
使用值 65534(十六进制的 0xFFFE,大端),使用下面的代码,我期望第一个 printf 会打印出来 0xFE FF,而第二个 0XFF FE。 结果反而相反,为什么?
int main(){
uint16_t x=65534;
uint16_t y=htons(x);
printf("%02x %02x\n",((uint8_t*)&x)[0],((uint8_t*)&x)[1]); //prints fe ff
printf("%02x %02x\n\n",((uint8_t*)&y)[0],((uint8_t*)&y)[1]); // prints ff fe
printf("%02x %02x\n",x>>8,(uint8_t)x);//prints ff fe
printf("%02x %02x\n",y>>8,(uint8_t)y);//prints fe ff
return 0;
}
在这个回答中我假设:
- 您代码中的注释是正确的,描述的是实际发生的情况,而不是您想要发生的情况。
- 因此您的问题涉及第二对 printf。
- 您是 运行 基于 Intel 的 Mac(确实是小端)。
C 的位移运算符的结果与字节序无关。如果 x
是一个 uint16_t
,x>>8
总是 return x
的高字节,无论该字节是存储在第一个还是第二个x
的内存表示的字节。