首页 > 代码库 > 浅谈大端和小端
浅谈大端和小端
最近在看关于大端小端的问题首先请允许我引用一段
一、大端模式和小端模式的起源
关于大端小端名词的由来,有一个有趣的故事,来自于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;
}