欢迎加入我们的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