写了几年程序从来都没有认真考虑过大小端的问题,只是在记忆里依稀记得大小端两种数据正好相反,真正
在用到的时候就到网上查一查.不过我觉得大小端这个概念在写驱动或可移植性代码的程序员的头脑里需要时刻
存在.而我又有向这方面发展的意向,所以还是要认真研究研究.
趣闻:
端模式(Endian)的这个词出自Jonathan
Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方
法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big
Endian,从尖头开始将鸡蛋敲开的人被
归为Littile
Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头
(Little-Endian)敲开。在计算机业Big
Endian和Little Endian也几乎引起一场战争。
究竟:
我们这里不谈论"战争"的结果,就像我们不谈论大陆中国和台湾中国一样,她们本来就该采用统一的一种方
式来处理问题,就像大陆和台湾是一个统一体一样,但是她们没有.所以我们只看看它的究竟.
在计算机中数据一般都先存在内存中,(拿32位机来说)系统为内存的每一个位置都分配了一个地址.地址
从0x00000000开始到0xffffffff(也许你的内存没这么大).
那么对于小端(Little-Endain)来说,数据0x12345678在内存中的映像就是这个样子的:
________
78 0x00000000
56 0x00000001
34 0x00000002
12 0x00000003 也就是说小端是低位数据放在低地址,像i386(x86)就是这种处理器.
而大端正好相反:
________
12 0x00000000
34 0x00000001
56 0x00000002
78 0x00000003 也就是说大端是低位数据放在低地址,像SuperH4就是这种处理器.
测试:
至于如何来测试某一平台是大端还是小端,很多人给出了例子,我也在这里就按照他们的思路例一个出来:
C:
union end {
int a;
char b;
};
int main(int argc, char* argv[]) {
union end a;
a.a = 0x1;
if(a.b) {
printf("Little Endian\n");
} else {
printf("Big Endian\n");
}
return 0;
}
阅读(1036) | 评论(0) | 转发(0) |