【勤思善想 之 判断大端小端】我想到的判断大端小端的方法!绝对不同于网络上其他方法!



欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧! 158427611 


关于判断大端小端,网络上很多方法。

关于大端小端,介绍一下:

内存地址大家都知道是有序号顺序的,因为就是高低之分,大小之别了。

而数据在内存中存放都是化成二进制了的,同样就有了高低大小之别了。

假设存储0x12345678 这个数据

小端模式:CPU对操作数的存放是在顺序地址上面,数据从低字节到高字节:如图

内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12

大端模式:与小端模式相反啦,是以从高到底存放的:如图;
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78

大致的有一下几种:

【一】

bool CheckBig()

{

int i=1;    // i 在的二进制就是 00000001 在内存中占 4个字节 

char *p=(char *)&i;   //将 i 地址传给 p 并强制转换成char 类型,为的是造成 *p和i 所占字节数不同,因为可以判断 *p的数据损失情况

return (*p==1);// 若是大端,则*p留下的就是00000001 的 低位(即01),若是小端则留下的是00000001的高位(即 00)

//因而 true为大端 false 为小端

}


【二】

bool CheckBig()

{

union w{       //定义一个union 公用体,这里利用共用体是成员使用同一内存块的特性

int a;

char b;//取的是共用体的低位内存数据

} c;

c.a = 1;// a.c 00000001

return(c.b ==1); //判断c.b是c.a的高位(00)还是低位(01)

//高位则为 小端,低位则为大端

}


【三】说说我想到的方法

主要是看到结构体struct中提到的位域 概念,因而想到可以用位域这个功能判断大端小端;

结构体的位域使用方法

struct W{

char c:4; //只取c的低位四位内存数据

};

bool CheckBig()

{

W w;

w.c = 1;//  正常w.c的内存数据为 00000001 但是这里的位域控制,使得w.c 只取存在内存中的低四位数据 00 或者 01

return (w.c == 1); // 如果是大端 则w.c是取的是低位 01 如果是小端则 取的是 00

// true 大端 false 小端

}


本机器实验可以通过!



欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

你可能感兴趣的:(C++,windows,cpu,struct,数据)