我在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的位移算子的结果与端点无关。如果xuint16_tx>>8将始终返回x的高位字节,无论该字节是存储在x的内存表示的第一个字节还是第二个字节中。

10-07 19:01