Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4236132
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类: C/C++

2008-12-09 10:17:42

Little-Endian Big-Endian


什么是Big?什么是Little?要理解这个问题,必须要知道数据在机器中存储的规则.....

一句话解释:Little-Endian表示一个数的低位存放在低位地址

    所谓的Little-Endian,就是我们在学习汇编时候的高高低低原则,而Bit-Endian就是刚刚相反,例如:0x12345678h这个数据,在不同机器中存储是不同的

                 Big-Endian                                      Little-Endian

0字节            12h                                                    78h

1字节            34h                                                    56h

2字节            56h                                                    34h

3字节            78h                                                    12h

Little-Endian主要用在我们现在的PC的CPU中,Big-Endian则应用在目前的Mac机器中(注意:是指Power系列 处理器)


那么如何用C语言动态的得到CPU的字节序呢?
下面给出一个程序:

#include
static union
{
    char c[4];
    unsigned char l;//c[4]和l共有一个四字节的内存空间
} endian_test={ {'l','?','?','b'} };
#define ENDIANNESS ( (char)endian_test.l )
int main()
{
    if (ENDIANNESS == 'l')//低地址存低字节就是little endian
        printf("little endian\n");
    else
        printf("big endian\n");
}


或者更简单的:
bool isPlatformLittleEndian()
{
   int n = 1;
   return *((char*)&n) ? true : false;
}

第一段程序的理论依据是:union类型以其中size最大的为其大小,并且union的存放顺序是所有成员都是从低地址开始存放。

测试一下就知道,X86系列架构的CPU都是Little-Endian的

PS:关于Endian这个词语,我在网上看到其意思和起源

以下内容来自Pconline:

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
阅读(4448) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~