大端和小端

嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。

在小端模式中,其存放方式为

0X4000  00000001

0X4001  00000000

而在大端模式中,其存放方式为

0X4000  00000000

0X4001  00000001

若需用程序验证系统是大端模式还是小端模式,有两种方法

1.利用联合体的性质

    因为联合体中的成员是共享内存的,并且数据是从低地址存放的,可以利用这一性质判断。

?
typedef union 
{
     char a;
     short c;
}U;
  
int checkCPU1()  //若是小端则返回1,否则返回0 
{
     U u;
     u.c=1;
     //printf("%d\n",u.a);
     return u.a==1;
}

由于short占2字节,而char占1字节,当对c赋值为1时,若系统为小端模式,则在系统中存放方式为:

000000001

000000000

那么当取a的值时,a的整型值必定为1;否则为0.

2.强制取低地址单元的数据

?
int checkCPU2()
{
     short a=0x1234;
     char *p=( char *)&a;
     //printf("%d\n",*p);
     return *p==0x34;    
}

很显然,若是小端模式,指针p指向的单元里面的数据整型值必为0x34,否则为0x12。

测试程序:

?
/*测试系统大端模式/小端模式 2011.10.1*/ 
  
#include <iostream>
using namespace std;
  
typedef union 
{
     char a;
     short c;
}U;
  
int checkCPU1()  //若是小端则返回1,否则返回0 
{
     U u;
     u.c=1;
     //printf("%d\n",u.a);
     return u.a==1;
}
  
int checkCPU2()
{
     short a=0x1234;
     char *p=( char *)&a;
     //printf("%d\n",*p);
     return *p==0x34;    
  
int main( int argc, char *argv[])
{
     printf ( "%d\n" ,checkCPU1());
     printf ( "%d\n" ,checkCPU2());
     return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值