【问题标题】:Confused about htonl output对 htonl 输出感到困惑
【发布时间】:2014-02-12 22:28:44
【问题描述】:

我有一个简单的问题。这段代码:

   int t = 1;

   int y = htonl(t);
   printf("Y = %d, sizeof(int)=%d", y, sizeof(int));

打印

Y = 16777216, sizeof(int)=4

在小端机器上(实际上是在线编译器)。

我期待y 是数字(二进制​​):1000....000(0 - 31 次)。

但是 16777216 在 1 旁边只有大约 25 个零(二进制)。

我错过了什么?

【问题讨论】:

    标签: c binary endianness


    【解决方案1】:
    int t = 1;
    

    在内存中(对于 4 字节系统)以这种方式呈现

     ---------------
    | 0 | 0 | 0 | 1 |
     ---------------
      ^            ^
      | byte       | = 0x1 = 00000001 in binary
    

    二进制格式是

    00000000 00000000 00000000 00000001 
    

    htonl() 如果您的系统是小端系统,则允许反转字节

    所以htonl(t) 会返回:

     ---------------
    | 1 | 0 | 0 | 0 |
     ---------------
      ^
      | = 0x1 = 00000001 in binary
    

    所以二进制中的整个htonl(t)

    00000001 00000000 00000000 00000000
    

    等于16777216(十进制)

    【讨论】:

    • 是的,我最近赶上了。这就是数字中的 24-0 的原因:16777216
    【解决方案2】:

    它完全按照你的要求做了。

    你的十六进制输出是01 00 00 00htonl 在 little endian 上交换 字节,而不是位。

    16777216 = 0x01000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      相关资源
      最近更新 更多