大小端模式详解及其测定
程序员文章站
2022-04-22 12:08:15
...
大小端的寓言故事
有关大小端的争论,最早来自于《格列夫游记》里一个有趣的故事:
Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次*,其中一个皇帝因此送命,另一个丢了王位,产生*的原因就是另一个国家Blefuscu的国王大臣煽动起来的,*平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。
什么是大小端
目前普遍采用的是单字节编址方式,即对于每一个字节(8个位)编一个地址编号,这种方式对于单字节数据存储没有问题,但多字节的数据存储会带来问题,比如:要将整形 0x 87 65 43 21
(占四个字节)存储在其起始地址为 100
处,是将高位 87
存储在高地址 103 处,还是将 21
存储在 103 处,这是一个问题。
- 将数据的高位存储在低地址处的方式称为大端模式;
- 相反的,将数据的低位存储在低地址处的方式称为小端模式。
这样对于 0x 87 65 43 21 就有两种存储方式:
大小端的测定
下面给出两种测试方法(C语言):
- 用一个
char
的指针取得int
的第一个字节, 通过查看char
对应的是int
的高位数据还是低位数据,从而得出结果。代码如下:
#include <stdio.h>
int main()
{
int i = 0x87654321;
char *cp = (char*)&i;
printf("%d\n", *cp);
return 0;
}
结果如下:
- 通过联合体的特点:所有成员共享同一内存,来达到测试目的。代码如下:
#include<stdio.h>
int check()
{
union{
int i;
char c;
}ic;
ic.i = 0x87654321;
return ic.c == 0x21;
}
int main()
{
if (check())
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}
结果如下:
【作者:果冻 http://blog.csdn.net/jelly_9】
上一篇: union与大小端