字节顺序和位移位问题

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;
}

在这个回答中我假设:

  1. 您代码中的注释是正确的,描述的是实际发生的情况,而不是您想要发生的情况。
  2. 因此您的问题涉及第二对 printf。
  3. 您是 运行 基于 Intel 的 Mac(确实是小端)。

C 的位移运算符的结果与字节序无关。如果 x 是一个 uint16_tx>>8 总是 return x 的高字节,无论该字节是存储在第一个还是第二个x 的内存表示的字节。