1.首先,这个概念是怎么来的,我百度了一下,在这里简单说明一下:
出自Jonathan Swift在1726年写的讽刺小说《格列佛游记》(Gulliver's Travels)。小人国的内战就源于吃水煮鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生6次叛乱,其中一个皇帝送了命,另一个丢了王位。
——《程序员的自我修养》
另外,我在其他地方看到其实最早的时候并不是叫大小端,而是叫 “高尾端” 和 “低尾端” ,高对应大,低对应
小,相对于大小端来说还是后者更容易理解!
// 解释一下就是将 0x11223344 看作字符串 “0x11223344\0”;尾端:44;
// 高尾端就是 “11 22 33 44” 进行存储;(大端)
地址 0 1 2 3
低地址--->高地址:尾端44存在高地址;
// 低尾端就是 “ 44 33 22 11”进行存储;(小端)
地址 0 1 2 3
低地址--->高地址:尾端44存在低地址;
2. 在这里先列出我所知到的两种判断机器大小端存储的方式:
方式 1:
/* 利用指针来区分大小端 */
void Judge_duan()
{
int a = 1; //定义为1是为了方便 如果你喜欢你可以随意,
//只要你能搞清楚 例如:0x11223344;
char *p = (char *)&a;//在这里将整形a的地址转化为char*;
//方便后面取一个字节内容
if(*p == 1)//在这里解引用了p的一个字节的内容与1进行比较;
printf("小端\n");
else
printf("大端\n");
}
这是我自己画的图解 比较粗糙 希望可以帮助大家理解!
方式 2:
/* 利用联合体来检测大小端 */
#include<stdio.h>
#include<stdlib.h>
void Judge_duan(void)
{
union t
{
int i;
char c;
} t1;
t1.i = 1;
if(t1.c == 1)
printf("小端\n");
else
printf("大端\n");
}
int main()
{
Judge_duan();//在这里我们封装成一个函数,
//可以有参数和返回值也可以不需要
system("pause");
return 0;
}
联合的概念在这里我简单的说明一下,不作详细介绍;
3.联合:
联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而
结构体各个成员各自拥有内存,各自使用互不干涉。
(大小端存储效率问题在此不作深究)
4. 插入一个注意事项。也是我最近犯过的错误!长时间没有编写过大小端程序的话,可能会犯!
void Judge_duan(void)
{
int a = 1;
char p = (char)a;
if(a==1)
printf("little");
else
printf("big");
}
这个程序乍一看是不是没反应过来,其实也是个低端错误,只想着取 a 的第一个字节内容,就把 a 强制转换为
char 类型,这只是把 int 类型的 a 的十进制大小表示的 字符类型表示出来而已,并没有牵扯到大小端问题,希
望以后不会犯此类错误!
以上是我对机器大小端判定的理解,请多多指教!