您的位置:首页 > 其它

大端小端的判断

2015-11-06 21:39 183 查看

大端小端的判断

1、联合体(共用体)

unionU
{
chars[9];
intn;
doubled;
};


联合体和结构体的定义和使用是一样的,就不详细的赘述。必须要记住:联合体所有的成员变量都是共享同一块内存的,从相同的起始地址进行赋值。也就是给联合体的一个成员变量赋值的时候,就会改变其他成员变量的值。

联合体的大小:

对于计算一个联合体的大小(共用体)来说,不同的编译器计算的结果是不同的。

VS2013:

unionU
{
chars[9];
intn;
doubled;
};
intmain(intargc,char*argv[])
{

unionUaa;
printf("sizeof(unionU)=%d\n",sizeof(aa));
while(1);
}


打印的结果是:16。分析:联合体的大小满足两个条件:(1)max(成员变量),所以分配的最大的空间是9个字节;(2)联合体的大小必须是成员变量类型大小的整数倍;所以,结合上下的两个条件,联合体的大小就是16。

GCC:

gcc计算的结果等于12个字节。经过多次的测试,gcc对于内存的对齐的要求是4个字节。

结构体和联合区的区别:

(1)结构体和联合体都是由多个不同的类型成员组成的。但是,在同一个时候,联合体只存放了一个被选中的成员(所有的联合体公用一块地址空间),结构体的所有的成员则是都存在(不同的成员存在的地址都不相同)

(2)对于联合体的不同成员赋值,那么其他的成员将会被重写,原来的成员的值将不存在,而对于结构体来说不同的成员的赋值是互不影响的。

2、大端小端的定义

对于多字节的数据的存储来说,有16位,32位等,对于多字节的存储就必然寸在对字节安排存储的问题,这个就是大小端区别的存在。

大端模式:数据的高字节序存储在低地址中,而数据的低字节序存储在高地址中。

小端模式:数据的高字节序存储在高地址中,而数据的低字节序存储在低地址中。





3、代码

#include<iostream>
usingnamespacestd;
unionud
{
inta;
charb;
};
boolceshi()
{
udc;
c.a=1;
return(c.b==1);
}
intmain(intargc,char**argv)
{

if(ceshi())
{
cout<<"is小端"<<endl;
}
else
{
cout<<"is大端"<<endl;
}
while(1);

return0;
}


代码分析:借助了联合体的帮助,联合体的特性存储的数据从低地址开始存储。而数据的读取也是从低地址开始读值。

分析:
a是四个字,a=1,也就是a=0x00000001;当系统是大端的时候,高字节序存储在低地址,低字节序存储在高地址,那么是这么存储的

地址:0123
a:00000001




b是一个字节,当系统是是小端的时候,高字节序存储在高地址,低字节序存储在低地址,那么是这么存储的:



地址:0123
a存储:01000000


那么b取数值的时候,那么b是一个字节,这个时候,b的值就是1


借助了联合体的帮助,当取得数值是1的时候,那么就是小端了。

B、使用地址的转换实现



#include<stdio.h>
intmain()
{
inttest=1;
if(*(char*)&test)
printf("Littleendianbyteorder!\n");
else
printf("Bigendianbyteorder!\n");
return0;
}


分析,是因为对于test来说:

高字节序低字节序
00000001


那么对test进行强制char类型转换,转换之后,char是读取最低字节的内存数据,也就是说,当读取到01的时候,那么01的位置就是最低的地址,也就是低地址保存低字节序,高地址保存高字节序,所以这个时候,就是小端了,

相反,当char类型读取到的数据是00的时候,也就是说,00这个位置是低地址,那么这个时候,低地址保存高字节序,高地址保存的是低字节序,所以,这个时候就是大端。

4、枚举

在程序的设计中,有时候会用到将有限个元素组成的集合,比如是星期一到星期天组成的集合,或者有RGB组成的集合,等等。

enum<枚举类型的名字>
{x1,x2,x3,,,,};


比如:

enumweekdays
{mon,tue,wed,thu,fri,sat,sun};


也就是定义了weekdays的枚举类型,它包含了七个元素。在编译器进行编译的时候,会给每个类型中的每一个元素都指定对应的整型的常量值,也称之为序号值。如果没有给指定的元素一个整型的常量值的话,那么整型的常量值是从零开始进行递增的。当将枚举类型中的除了第一个元素指定了一个常量值的话,那么前面的常量值是从零开始进行分配的,而被指定常量值的后面的部分,则是根据指定的一次递增。比如:

enumstring


{x1,x2,x3=10,x4,x5,x6,x7};


那么,显然x3已经是指定了一个常量值,则x1=0,x2=1,x4=11,x5=12,x6=13,x7=14,

分类:C语言学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: