大端小端,如何检测
- ⼤端模式:是指数据的⾼字节保存在内存的低地址中,⽽数据的低字节保存在内存的⾼地址端。
- ⼩端模式,是指数据的⾼字节保存在内存的⾼地址中,低位字节保存在在内存的低地址端。
直接读取存放在内存中的⼗六进制数值,取低位进⾏值判断
int32_t a = 0x12345678;
char *c = (char*)&a;
c[0] == 0x12 ⼤端模式
c[0] == 0x78 ⼩端模式
windows上组织形式:
0x000000A1E3F3B044 78 56 34 12 cc cc
故windows上是小端
⽤共同体来进⾏判断
union 共同体所有数据成员是共享⼀段内存的,后写⼊的成员数据将覆盖之前的成员数据,成员数据都有相同的⾸地址。Union的⼤⼩为最⼤数据成员的⼤⼩。
union 的成员数据共⽤内存,并且⾸地址都是低地址⾸字节。int i= 1时:⼤端存储1放在最⾼
位,⼩端存储1放在最低位。当读取char ch时,是最低地址⾸字节,⼤⼩端会显示不同的值。
#include <stdio.h>
int main() {
union {
int a; //4 bytes
char b; //1 byte
} data;
data.a = 1; //占4 bytes,⼗六进制可表示为 0x 00 00 00 01
//b因为是char型只占1Byte,a因为是int型占4Byte
//所以,在联合体data所占内存中,b所占内存等于a所占内存的低地址部分
if(1 == data.b) {
//⾛到这⾥意味着说明a的低字节,被取给到了b
//即a的低字节存在了联合体所占内存的(起始)低地址,符合⼩端模式特征
printf("Little_Endian\n");
} else {
printf("Big_Endian\n");
}
return 0;
}