大小端(big/little endian)

12 篇文章 0 订阅

1.Endian的由来

          Endian这个词最早出自于乔纳森·斯威夫特所写的《格列佛游记》,书中根据人们吃 鸡蛋的方式将人分为两类:一类为从圆头打开鸡蛋开始吃的人(big endian);一类为从尖头打开鸡蛋开始吃的人(little endian)。《格列佛游记》中描述的小人国因为吃鸡蛋的方式不同而发生内战,此虚构的故事实为讽刺当时的英国议会中毫无意义的党派斗争,统治集团的昏庸腐朽和唯利视图。

2.大小端的定义

       考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种方法是将低序字节存储在低地址,高序字节存储在高地址,这种存储方式称为小端(little endian);另一种方法是将高序字节存储在低地址,低序字节存储在高地址,这种存储方式成为大端(big endian)。

3.常见处理器的大小端模式

i386          小端

power pc 大端

sparc64    大端

arm          大小端可配置

mips         大端模式

大小端模式是由处理器决定的,与具体操作系统没有关系,对于程序员来说编写程序完全可以按照小端模式来编写,编译器会帮我们处理大小端的问题。

4.大小端的影响

         网络协议中存在一个网络字节序,网际协议使用大端字节序传送多字节整数。从理论上说,具体实现可以按主机字节序存储套接字地址结构中的各个字段,等到需要在这些字段和协议首部相应字段之间移动时,再在主机字节序和网络字节序之间进行互转,让我们免于操心转换细节。linux系统当中提供了主机字节序和网络字节序之间转换的函数:

#include 《netinet/in。h》

uint16_t  htons(uint16_t host16bitvalue); //16位主机字节序转化为网络字节序

uint16_t  ntohs(uint16_t net16bitvalue); //16位网络字节序转化为主机字节序

uint32_t  htons(uint32_t host16bitvalue); //32位主机字节序转化为网络字节序

uint32_t  ntohs(uint32_t net16bitvalue); //32位网络字节序转化为主机字节序
5.大小端的判断方法

/*

*name:      bool judgeBigEndianCPU()

*function:  Judge CPU whether is big-endian

*input:       none

*output:     none

*return:      true-    is big endian

*                  false-  is little endian

*/

bool isBigEndianCPU() {
union w { short a; char b; } c;
c.a = 1;
return (c.b == 0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值