三种方法实现大小端判断问题

C语言中的引用共用体变量的方式:有点像c++里面定义了一个类,再将对象输出.

union里面的成员ci都是从低地址开始对齐的。

首先明确:

因为cpu在对存储数据的的读取顺序是从低地址读到高地址的,所以先读char,

看似可行实际不行的测试大小端方式:位与,移位,强制类型转化

计算机中的,数据是以字节的形式存在的。每个地址单元对应着一个字节,(共8个位)。


判断方法:

采用大小端模式对数据进行存放的主要区别在于在存放的字节顺序

如果计算机中的低字节存的是数据的高字节的数据,则可判断是大端模式。

也就是:大端方式将高位存放在低地址,小端方式将低位存放在低地址。


这里注意::一个16进制的数据0x12345678,中的78是低位,存放在内存中的高位中。所以如果定义了short int a=0x12345678;在大端的模式下输出的是12.


通常记住xp是

而KEIL-C51则为大端模式。

很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。


代码测试:三种方法:

/* ///////三种方法判断大小端模式


////////首先明确内个
//////---------------------------------------------------------------法一:通过移位来确定

int is_little_endian(void)//判断是否是小端的函数
{
union check_fun
{
int a;
char b;
}u1;
u1.a=1;//先将1(实际上就是0x0001)这个低字节放在存储空间的低位上
return u1.b;//这里实际上是进行了类型的强制装换
}
int main()
{
int i=is_little_endian();
if(i==1)
printf("little\n");//首先因为cpu在对存储数据的读取是从低位向高位读取的,而且在union中所有的成员是对齐读取的,所以如果读取到的b=1,说明char b是存放在低字节的
else
printf("big endian\n");
}

//////---------------------------------------------------------------法二:强制类型的转换:

int main()

{
int i=1;
char *b=(char *)&i;//char是一个字节,强制将char 类型的b指向i,则b指向的一定是i的低地址
if(*b==1)
printf("little\n");
else
printf("big\n");
return 0;
}

//////---------------------------------------------------------------法三:观察变量内存值
/////通过直接看变量的内存值,用16进制输出short型变量a在内存中的分布来判断

void main()
{
short a=0x12345678;
char *p=(char *)&a;
printf("%p\n %x\n %x\n",&a,p[0],p[1]);//如果p[0]输出了78,说明低字节放在低位,是小端,如果输出12,说明是大端。
}
 */

此处顺便提一下bool类型的用法。

bool跟int ,char 一样,也是一种数据类型,但是它只能等于两个值,就是只能等于true和false,而不能等于一个数值,而true和false对应等于1和0.

而且在使用该数据类型的时候需要加头文件#include

例如:

#include

#include

int main()

{
bool a=true;

bool b=false;

printf("a=%d\n",a);     //1

printf("b=%d\n",b); //0

return 0;
}

下面的就是看似可以判断,实际上不可行的大小端判断方法:

三种方法实现大小端判断问题_第1张图片                                                                                                                                                                                                                                                                                                                                                 

         

   



你可能感兴趣的:(c)