关于机器大小端的判定

来源:互联网 发布:美国劳动生产率数据 编辑:程序博客网 时间:2024/05/17 09:04
关于大小端
             (本人在这个大小端问题上栽倒好多次了)

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

           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");elseprintf("大端\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");elseprintf("big");}


   这个程序乍一看是不是没反应过来,其实也是个低端错误,只想着取 a 的第一个字节内容,就把 a 强制转换为

char 类型,这只是把 int 类型的 a 的十进制大小表示的 字符类型表示出来而已,并没有牵扯到大小端问题,希

望以后不会犯此类错误!

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


1 0
原创粉丝点击