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

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

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

Big Endian

低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     12     |      34    |     56      |     78    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址                                            高地址
   ----------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     78     |      56    |     34      |     12    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而J***A编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的J***A程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了J***A程序,由于J***A采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给J***A程序之前有必要进行字节序的转换工作。

无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

最新文章

  1. sql select 综合运用
  2. Assets和Raw区别
  3. 2016C#模拟谷歌Google登陆Gmail&Youtube小案例
  4. HTML笔记(三) 列表
  5. ckeditor 升级到 4.5
  6. C#中linq
  7. 关于extern对变量的使用
  8. 扩展第三方DropDownMenu
  9. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
  10. 学习新手给Android新手的一些学习建议
  11. python中循环删除列表中元素时的坑!
  12. spring配置文件注入到静态变量
  13. 2802:小游戏利用bfs来实现
  14. k8s使用Glusterfs动态生成pv
  15. Android自动化测试探索
  16. failed to open stream: Permission denied in警告错误
  17. 基础005_V7-Select IO
  18. 依赖注入:Ninject学习笔记
  19. [LeetCode] 112. Path Sum_Easy tag: DFS
  20. “App.exe 以附加有调试器,但没有将该调试器配置为调试此未经处理的异常。”

热门文章

  1. TD - 输入框
  2. HashMap源码(一)
  3. go语言 实现哈希算法
  4. Lumen 实现接口 Captcha图片验证码功能
  5. 操作系统-多用户如何理解(Linux)
  6. C++ 深拷贝实例-改变原生数组
  7. Leetcode 74. 搜索二维矩阵 C+
  8. try/catch/finally 语句
  9. STL初探
  10. DisplayNameFor()方法的工作原理