Tag Archives: byte order

关于“字节序”

昨天纠正了长达几年的关于字节序的错误理解。

受到移位操作符的影响,一直认为在内存中数字的保存方式和显示的一样,比如一个2直接的short 9 ,保存在内存中应该是:

00 09 这种形式,因为这样移位才说的通。 否则如果按照低字节优先的方法 09 00 右移位就会出乱子了~

结果昨天研究和服务器socket通讯的例子中 发现了个陌生函数 :htonl  。

man (越来越喜欢命令行了)后发现是 host to network long(short) 的缩写 ,这下彻底困惑了。难道 c 在内存中的数据不是想象中的那样?

最后K大侠亲自上阵,示范了使用GDB debug ,也帮我验证了我多年的错误观点:

#include <stdio.h>
int main()
{
 int a = 8;
 char *p;
 p= (char*)&a;
 a = a>>1;
 char *k = &a;
 return 0;
}
  • gcc -g test.c   # -g 添加调试
  • gdb test.out   # init
  • b main          # add breakpoint at main function
  • run                 # just run until breakPoint occured
  • n                    # next

逐次打印出 p 指针的值 p *(p++)   , 发现果然是地位在最前面的。
不过对于移位操作就困惑了,难道这个操作不是直接在内存操作的?难道是先转成高位优先然后移位再转回来? Read more »