计算机中多字节存储顺序,小端、大端、网络字节序

 

1.  2在计算机中的存储为10

2.  (x<<1) 等价于乘2

 

如果要有左右顺序来看计算机内存的排列的话,那么排序顺序如下:

也就是内存从右到左升序。

例子: 观察int在计算机是如何存储的

  int a = 197121;//0-3-2-1
    int* p = &a;
    char* cp = (char*)p;
    std::cout << "adrs:" << (int)cp << ", " << (int)*cp << std::endl;
    std::cout << "adrs:" << int(cp + 1) << ", " << (int)*(cp + 1) << std::endl;
    std::cout << "adrs:" << int(cp + 2) << ", " << (int)*(cp + 2) << std::endl;
    std::cout << "adrs:" << int(cp + 3) << ", " << (int)*(cp + 3) << std::endl;

结果:

可以发现,int类型中数据的低位与内存的低位相对应(小端模式)。

配合平时一直用的左移、右移操作即可发现存储顺序。

197121在内存中的表示为:

 

这篇文字很有灵性:https://zhuanlan.zhihu.com/p/21388517

大小端问题主要涉及的是非单字节非字符串外的其余数据的表示和传递。

小端:数字的低位 对应于 地址低位

大端:数字的高位 对应于 地址低位

 

 网络字节序

前面的大端和小端都是在说计算机自己,也被称作主机字节序。其实,只要自己能够自圆其说是没啥问题的。问题是,网络的出现使得计算机可以通信了。通信,就意味着相处,相处必须得有共同语言啊,得说普通话,要不然就容易会错意,下了一个小时的小电影发现打不开,理解错误了!

但是每个计算机都有自己的主机字节序啊,还都不依不饶,坚持做自己,怎么办?

TCP/IP协议隆重出场,RFC1700规定使用“大端”字节序为网络字节序,其他不使用大端的计算机要注意了,发送数据的时候必须要将自己的主机字节序转换为网络字节序(即“大端”字节序),接收到的数据再转换为自己的主机字节序。这样就与CPU、操作系统无关了,实现了网络通信的标准化。突然觉得,TCP/IP协议好任性啊有木有!

为了程序的兼容,你会看到,程序员们每次发送和接受数据都要进行转换,这样做的目的是保证代码在任何计算机上执行时都能达到预期的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值