目录
一、定义:
小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
将0x12345678写入到以1000h开始的内存中,这里0x12346578中0x12~0x78的地址是从高到低
如果,我们的机器是小端存储的话,结果为:
数据 地址
0x78 1000H
0x56 1001H
0x34 1002H
0x12 1003H
如果我们的机器是大端存储的话,结果为:
数据 地址
0x12 1000H
0x34 1001H
0x56 1002H
0x78 1003H
二、实现
1、方法1
是利用定义,在地址上判断存的是否是高低位的数据,来解决问题.
2、方法2
在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。即上述的union虽然定义了两个成员,但其实这个union只占用了4个字节(32位机器中),往a成员赋值,然后读取b就相读取a成员的低位第一个字节的值。
如果机器使用大端模式,则u.a=1那a的最高字节值为1;
如果机器使用小端模式,则u.a=1则a的最低位字节为1。
上述可知b和a有相同的起始位,所以读取b如果等于1,则为小端模式,b为0则为大端模式
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#include<stdlib.h>
#define INF 99999999
using namespace std;
int panduan_1(){
int a = 0x12345678;
char *c = (char*)&a;
for(int i = 0;i<4;i++){
printf("%x\n",c[i]);
}
return ((c[0]==0x78)&&(c[1]==0x56)&&(c[2]==0x34)&&(c[3]==0x12));
}
union p{
int a;
char b;
};
int panduan_2(){
p p1;
p1.a = 1;
return p1.a==p1.b;
}
int main(){
if(panduan_1()){
cout<<"little duan"<<endl;
}else{
cout<<"big duan"<<endl;
}
if(panduan_2()){
cout<<"little duan"<<endl;
}else{
cout<<"big duan"<<endl;
}
system("pause");
return 0;
}