谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?网络

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。函数

用文字说明可能比较抽象,下面用图像加以说明。好比数字0x12345678在两种不一样字节序CPU中的存储顺序以下所示:翻译

Big Endian指针

低地址 - 》 高地址内存

----------------------------------------------------------------------------->开发

| 12 | 34 | 56 | 78 |it

Little Endian io

低地址 —》 高地址编译

----------------------------------------------------------------------------->nio

| 78 | 56 | 34 | 12 |

从上面两图能够看出,采用big endian方式存储数据是符合咱们人类的思惟习惯的。

为何要注意字节序的问题呢?你可能这么问。固然,若是你写的程序只在单机环境下面运行,而且不和别人的程序打交道,那么你彻底能够忽略字节序的存在。可是,若是你的程序要跟别人的程序产生交互呢?尤为是当你把你在微机上运算的结果运用到计算机群上去的话。

在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则惟一采用big endian方式来存储数据。试想,若是你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来讲,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,因为JAVA采起big endian方式存储数据,很天然的它会将你的数据翻译为0x78563412。所以,在你的C程序传给JAVA程序以前有必要进行字节序的转换工做。

全部网络协议也都是采用big endian的方式来传输数据的。因此有时咱们也会把big endian方式称之为网络字节序。当两台采用不一样字节序的主机通讯时,在发送数据以前都必须通过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。

一道C语言的试题:请写一个C函数,若处理器是Big_endian的,则返回0;如果Little_endian的,则返回1。

解答:

int checkCPU()
{
 {
  union w
  {
   int a;
   char b;
  } c;
  c.a = 1;
  return (c.b == 1);
 }
}

嵌入式系统开发者应该对Little-endian和Big-endian模式很是了解。采用Little-endian模式的CPU对操做数的存放方式是从低字节到高字节,而Big-endian模式对操做数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little- endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

存放内容

0x4000

0x34

0x400

0x12
而在Big-endian模式CPU内存中的存放方式则为:

内存地址

存放内容

0x4000

0x12

0x4001

0x34

32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址

存放内容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址

存放内容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78

联合体union的存放顺序是全部成员都从低地址开始存放,解答利用该特性,轻松地得到了CPU对内存采用Little-endian仍是Big-endian模式读写。

X86 系列 CPU都是 little-endian 的, BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关,好比int,short,long型。
好比 int a = 0x05060708

在BIG-ENDIAN的状况下存放为:

字节号 0 1 2 3

数据 05 06 07 08

在LITTLE-ENDIAN的状况下存放为:

字节号 0 1 2 3

数据 08 07 06 05

Big-Endian 和 Little-Endian 模式的区别相关推荐

  1. Little endian和Big endian的区别

    许多嵌入式系统程序员对Little endian和Big endian模式的概念模糊不清,其实Little endian和Big endian是多字节寻址的微处理器中,两种数据书写和存储顺序的排列方式 ...

  2. 明明是数字“1000”转换成整形时却报错---BOM 非法字符 /65279(FEFF) big endian(FEFF)和little endian(FFFE) 模式

    前言: 今天看到一个提问,说遇到了这个问题 data[0]1000 java.lang.NumberFormatException: For input string: "1000&qu ...

  3. Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2

    Unicode.UTF-8.Big Endian.Little Endian.GBK.UCS-2 一.Unicode.UCS.GBK 1.开始计算机只在美国用.八位的字节一共可以组合出256(2的8次 ...

  4. CPU中的Little Endian与Big Endian

    CPU中的Little Endian与Big Endian 今天在学习利用buildroot编译软件包的时候,make menuconfig之后在Target Architecture选项中发现了同一 ...

  5. 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...

  6. 谈 三层结构与MVC模式的区别

    谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题.     那么我也来讲讲我对这两者的理解吧.    ...

  7. rethat安装MySQL多例_Spring框架-Bean作用域中单例模式和多例模式的区别

    Spring框架-Bean作用域中单例模式和多例模式的区别 一.单例模式的特点(当没有指定是单例模式还是多例模式的时候,默认是单例模式): 1.Spring容器创建的时候,对应的类的实例化对象一起被创 ...

  8. js组合模式和寄生组合模式的区别研究

    最近在阅读<js权威指南>的继承这一章,对于组合模式和寄生组合模式的区别有点混淆,在多次重读以及尝试之后,得到一些心得. 组合模式继承 结合了构造函数继承时可以为每个属性重新初始化,构造一 ...

  9. 浅析三层架构与MVC模式的区别

    浅析三层架构与MVC模式的区别 三层架构介绍: (点击链接即可见三层架构) MVC模式介绍: MVC全名是Model ViewController,是模型(model)-视图(view)-控制器(co ...

  10. big endian and little endian

    big endian(大端)和little endian(小端)表示机器对变量字节的存储顺序.big endian表示低地址存放最高有效字节,little endian表示低地址存放最低有效字节.这里 ...

最新文章

  1. JAVA Web项目中所出现错误及解决方式合集(不断更新中)
  2. Python 之 Pandas (三)选择数据
  3. Lync2013 恢复-整残之后如何重新安装
  4. python 获取 程序运行时间
  5. box_sizing
  6. .NET Remoting的新特性-IpcChannel(.NET Framework 2.0)
  7. 前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例
  8. C语言基本语法——结构体、联合和枚举
  9. python关键词对联_keras基于CNN和序列标注的对联机器人
  10. Android开发中Ant命令编译和APK签名的一些心得
  11. v$session,v$session_wait,v$session_wait_history,v$active_session_history
  12. ZooKeeper典型应用场景
  13. teamviewer路由器设置虚拟服务器,远程控制软件TeamViewer的配置详细操作步骤
  14. 2021年危险化学品生产单位安全生产管理人员考试内容及危险化学品生产单位安全生产管理人员新版试题
  15. 全局返回json数据简繁体字转换(返回数据里的中文全改成繁体字)
  16. 【学习笔记】英文科技论文常见英语句式积累
  17. 2022年二级建造师考试机电工程练习题及答案
  18. char *c和char c[]区别
  19. 如何把语音文件转成文字格式
  20. CE认证电气间隙和爬电距离要求

热门文章

  1. workbench如何截图_戴尔键盘电脑如何快捷键截屏
  2. Java合成图片及文字--Graphics2D
  3. TM中拒收自定义表情的设置方法(转)
  4. 视频与编解码的技术邂逅,碰撞出的高清罗曼史
  5. 塞班系统更新服务器,塞班系统又更新了,又更新了,仿佛回到十年前!
  6. 数据结构c语言版陈越,数据结构 陈越
  7. 实时查看MD文件效果 - 在线Markdown预览
  8. tf.expand_dims用法详解
  9. ArcGIS10.6基本操作——利用DEM给点赋予高程值
  10. 八爪鱼采集ajax表格,设置八爪鱼采集器ajax延时采集分页列表的方法