关闭

几行代码解决大端小端的问题

标签: 大端小端
4506人阅读 评论(0) 收藏 举报
分类:

  1. int checkcpu (void)
  2. {
  3. {
  4. union w
  5. {
  6. int  a;
  7. char b;
  8. }c;
  9. c.a = 1;
  10. return (c.b == 1);
  11. }
  12. }

根据返回值判断处理器是大端还是小端。

什么是高/低地址端

首先我们要知道C程序映像中内存的空间布局情况:在《C专 家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:

----------------------- 最高内存地址 0xffffffff

栈底

栈顶

-----------------------


NULL (空洞)

-----------------------

-----------------------

未初始 化的数据

----------------------- 统称数据段

初始化的数据

-----------------------

正 文段(代码段)

----------------------- 最低内存地址 0x00000000

由图可以看出,再内存分布中,栈是向下增长的,而堆是向上增长的。

以上图为例如果我们在栈 上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢?看下图:

栈底 (高地址)

----------

buf[3]

buf[2]

buf[1]

buf[0]

----------

栈顶 (低地址)

其实,我们可以自己在编译器里面创建一个数组,然后分别输出数组种每个元素的地址,来验证一下。

1.2 什么是高/低字节

现在我们弄清了高/低地址,接着考虑高/低字节。有些文章中称低位字节为最低有效位,高位字节为最高有效位。如果我们有一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢? 其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

高/低地址端和高/低字节都弄清了。我们再来回顾 一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:

以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:

Big-Endian: 低地址存放高位,如下图:

栈底 (高地址)

---------------

buf[3] (0x78) -- 低位

buf[2] (0x56)

buf[1] (0x34)

buf[0] (0x12) -- 高位

---------------

栈顶 (低地址)


Little-Endian: 低地址存放低位,如下图:

栈底 (高地址)

---------------

buf[3] (0x12) -- 高位

buf[2] (0x34)

buf[1] (0x56)

buf[0] (0x78) -- 低位

--------------

栈 顶 (低地址)

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:514347次
    • 积分:5384
    • 等级:
    • 排名:第4963名
    • 原创:91篇
    • 转载:27篇
    • 译文:0篇
    • 评论:48条
    博客专栏
    最新评论