对htonl输出感到困惑

时间:2014-02-12 14:15:01

标签: c binary endianness

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

   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个零(二进制)。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

它完全符合您的要求。

您的十六进制输出为01 00 00 00。小端的htonl交换字节,而不是位。

16777216 = 0x01000000