关于机器大小端的判定

关于大小端
             (本人在这个大小端问题上栽倒好多次了)

        大端存储:高字节存储在低地址中,即高位先存;
        小端存储:低字节存储在高地址中,即低位先存;

           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");

}


关于机器大小端的判定_第1张图片

这是我自己画的图解  比较粗糙 希望可以帮助大家理解!

方式 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 的十进制大小表示的 字符类型表示出来而已,并没有牵扯到大小端问题,希

望以后不会犯此类错误!

     以上是我对机器大小端判定的理解,请多多指教!


你可能感兴趣的:(C语言,大小端)