判断系统大小端模式

  判断系统大小端模式

端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本书使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)

地址偏移    大端模式             小端模式

0x00        12(OP0)        78(OP3)

0x01        34(OP1)        56(OP2)

0x02        56(OP2)        34(OP1)

0x03        78(OP3)        12(OP0)

判断大小端的方法:

1,大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。

 view plaincopy to clipboardprint?

#include <stdio.h>    

#include <stdlib.h>    

#include <unistd.h>     

     

int main(int argc, char **argv)     

{    

    int i = 1;     

    char *cp = (char *)&i;         

    if (*cp)      

        printf("Little Endian\n");    

    else      

        printf("Big Endian\n");    

     

    exit(EXIT_SUCCESS);     

}  

#include <stdio.h>  

#include <stdlib.h>  

#include <unistd.h>  

   

int main(int argc, char **argv)  

{  

    int i = 1;  

    char *cp = (char *)&i;       

    if (*cp)   

        printf("Little Endian\n"); 

    else   

        printf("Big Endian\n"); 

  

    exit(EXIT_SUCCESS);  

}

2,联合题union的存放顺序是从低地址开始存放,利用这个特性

view plaincopy to clipboardprint?

int checkCPU( )   

{   

    {   

       union w  

       {     

           int a;   

           char b;   

       } c;   

       c.a = 1;   

       return(c.b ==1);   

    }   

}  

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/thebirdofwonder/archive/2009/04/26/4125103.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值