- 定义: 数据存放在地址中,一个地址码对应一个字节。内存的低地址存放数据的低位,则存储方式为小端存储;内存的低地址存放数据的高位,则为大端存储。
- 判断大小端的方法有两种:数据类型转换法、联合体法
- 数据类型转换法
short a = 0x1234;
char b = (char)a;
cout << hex << b << endl;
运行结果:
说明我的系统(Ubuntu 18.04 LTS)存储数据的方式是小端存储
- 联合体法
联合体的存储方式是从低地址开始存,里面的数据共用一份地址
union aaa{
short a; // 占用2个字节
char b; //占用1个字节
};
int main(int argc, char const *argv[])
{
union aaa x;
x.a = 0x1234;
cout << hex << x.a << endl;
cout << hex << x.b << endl;
return 0;
}
运行结果:
说明我的系统(Ubuntu 18.04 LTS)存储数据的方式是小端存储
注:移位不能用来判断大小端,但可以用来大小端转化
- 32位系统
int swap_big_small_32(int value)
{
return(((value & 0x000000FFU)<<24) + ((value & 0x0000FF00U)<<8) +
((value & 0x00FF0000U)>>8) + ((value & 0xFF000000U)>>24));
}
int main(int argc, char const *argv[])
{
int a = 0x12345678;
cout << "before swap:" << "hex:" << hex << a <<endl;
a = swap_big_small_32(a);
cout << "after swap: " << "hex:" << hex << a <<endl;
return 0;
}
64位系统
#include <iostream>
using namespace std;
long swap_big_small_32(int value){ //先将8字节数据转为4字节数据,最后再转回去
return long((((value & 0x000000FFU)<<24) + ((value & 0x0000FF00U)<<8) +
((value & 0x00FF0000U)>>8) + ((value & 0xFF000000U)>>24)));
}
long swap_big_small_64(long value){
long a = swap_big_small_32(int(value)); //先将低32位大小端转换
long b = swap_big_small_32(int(value>>32)); //再将高32位大小端转换
long c = (a<<32) + b; // 将a赋到高32位上 再与b进行或运算
return c;
}
int main(int argc, char const *argv[])
{
long a = 0x1234567813151719;
cout << "before swap:" << "hex:" << hex << a <<endl;
a = swap_big_small_64(a);
cout << "after swap: " << "hex:" << hex << a <<endl;
return 0;
}
运行结果:
大小端转化后不是完全反过来(9171513187654321),因为相邻两个数构成一个字节,字节在大小端转换后不能改变,所以相邻两个应看成一个整体进行倒序