【问题标题】:Problems with endianness and bit shift字节顺序和位移问题
【发布时间】:2020-01-13 09:55:39
【问题描述】:

我在 Mac 上用 C 做一些实验(应该是小端架构),我注意到一个奇怪的事实,试图打印 uint16_t 变量的低字节和高字节。

使用值 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 会打印 0xFE FF" 确实如此,那么问题是什么?

标签: c hex byte endianness


【解决方案1】:

在这个答案中,我会假设:

  1. 您的代码中的 cmets 是正确的,并且描述了实际发生的事情,而不是您想要发生的事情。
  2. 因此您的问题是指第二对 printf。
  3. 您在基于 Intel 的 Mac 上运行(确实是 little-endian)。

C 的位移运算符的结果与字节顺序无关。如果xuint16_t,则x>>8 将始终返回x 的高字节,无论该字节存储在x 的内存表示的第一个字节还是第二个字节中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多