我在m a C上用C做了一些实验(这应该是一个小小的endian架构),我注意到一个奇怪的事实,试图打印uint16_t变量的上下字节。
使用值65534(十六进制的0xFFFE,big endian)和下面的代码,我希望第一个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。
你运行的是一个基于英特尔的Mac(实际上是一个小endian)。
C的位移算子的结果与端点无关。如果x
是uint16_t
,x>>8
将始终返回x
的高位字节,无论该字节是存储在x
的内存表示的第一个字节还是第二个字节中。