首页 > 代码库 > 浅谈大端和小端

浅谈大端和小端

  最近在看关于大端小端的问题首先请允许我引用一段

一、大端模式和小端模式的起源

        关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始 的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须 先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个 国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。 这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

 

二、什么是大端和小端

  大端是将存储数据的低位存放在高地址上,高位存放在低地址上,如int a= 0x12345678这个十六进制的数分为4份

0x12   0x34   0x56  0x78(数据的低位) 

低地址    ->      高地址

感觉像是字符串是存放方式"0x12345678" 是字符串依次存放

  小端是将数据的低位存放在低地址,高位存放在高地址上.如int a= 0x12345678这个十六进制的数分为4份

0x78(数据的低位)   0x56   0x34  0x12          //一开始我居然不知道十六进制的数据居然是从右往左

低地址    ->      高地址  

这类更加符合我们的逻辑思维,而且一般的*86的都是小端

编写一个程序判断

1

#include <stdio.h>
int main (void)
{
    int a = 0x12345678;
    int *c = a;
    short *b = NULL;
    b = (short *) c;
    if (b == 0x5678)
        printf ("Big Endian\n");
    else
        printf ("Little Endian\n");
    return 0;
        
}
因为共用体union所有成员存放顺序从低地址存放

#include <stdio.h>
union st
{
    int a;
    char b;
} s;
int main (void)
{
    s.a = 0x1234;
    if (s.b == 0x34)
        printf ("Llttle Endian!\n");
    else
        printf ("Big Endian!\n");
    return 0;
}