c语言 如何选择 大小端,c语言大小端的问题

在计算机中数据一般都先存在内存中,(32位机来说)系统为内存的每一个位置都分配了一个地址,地址从0x00000000开始到0xffffffff。

BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型数的数据有关,比如int,short,long型,而对单字节数据byte却没有影响。big-endian就是低位字节排放在内存的高端,高位字节存放在内存的低端。

little-endian正好相反。

比如 int a=

0x05060708,一个int类型数据一般为4个字节(跟具体编译环境有关),用2000,20001,2002,2003表示。

在大端情况下:地址: 数据 在小端情况下: 地址: 数据

2000 05 2000 08

2001 06 2001 07

2002 07 2002 06

2003 08 2003 05

再比如,一个整形数据为a=0x12345678,如果是小端存储,则我们设置一个指针指向这个数据时,这个指针指向的是78,如果相反,则就是高端存储,根据这个解释,我们可以编写如下代码,来测试自己的机器到底是低端存储还是高端存储。

那么对于小端来说,数据0x12345678在内存中的映像是这样子的:

78 0x00000000

56 0x00000001

34 0x00000002

12 0x00000003

小端是低位数据在低地址,像i386(x86)就是这种处理器。

大端正好相反:

12 0x00000000

34 0x00000001

56 0x00000002

78 0x00000003

也就是说大端是低位数据放在高地址,像SuperH4就是这种处理器。

测试大小端代码:

#include

void main()

{

int a=0x12345678;

char *p;

p=(char*)(&a); //取出占用的首地址

if(*p==0x78)

printf("the little endian\n");

else

printf("the big endian\n");

}

方法2:用共用体判断,代码如下:

int check()

{

union w

{

int a;

char b;

}c;

c.a = 1;

return(c.b==1);

}

void main ()

{

if(check() ==1)

printf("the little endian\n");

else

printf("the big endian\n");

}

因为共用体是共用一块内存区域的,我们不妨创建一个包含一个整形和一个字符型的共用体,给共用体的整形数据赋值1,这时我们判断字符变量是不是1,因为字符型变量占据这块内存的低地址,如果是小端类型,这时低地址应该放置地数据1,那么我们通过字符变量就可以显示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值