1. 基本概念
- 字节序就是超过一个字节的数据类型在内存中的存放顺序,通常需要在跨平台和网络相关的开发中需要留意的问题
- 字节序不是由操作系统决定的,而是由CPU架构所决定的
2. 大小端
字节序被分为两个类型
- 大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
- 小段:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
3. 判断当前设备是那一种字节序
1. 通过一个简单的demo来分析
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int a=1;
int b=2;
int main(){
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
return 0;
}
执行结果:
1
2
&a=0x5653c26aa010
&b=0x5653c26aa014
可以是a先申请内存,再到b,但是a分到的地址比b小,在栈中申请内存是从低到高
2. 再通过一个demo来判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
union Data{
char index[4];
int a;
char b;
};
int main(){
union Data *data = (Data*)(calloc(1,sizeof(Data)));
data->a = 0x01020304;
printf("data->a=%p , %x\n",&(data->a), data->a);
for(int i=0;i<4;i++){
printf("data->index[%d]=%p %d\n",i,(data->index+i),*(data->index+i));
}
printf("data->b=%p , %d\n",&(data->b),data->b);
free(data);
return 0;
}
执行结果:
1
2
3
4
5
6
data->a=0x7fffe4f93e70 , 1020304
data->index[0]=0x7fffe4f93e70 4
data->index[1]=0x7fffe4f93e71 3
data->index[2]=0x7fffe4f93e72 2
data->index[3]=0x7fffe4f93e73 1
data->b=0x7fffe4f93e70 , 4
- 利用共用体的特性,共用体的大小是内部成员中最大的类型的大小,并且所有成员共用同一个内存
- 当先对data->a赋值0x01020304,同时查看data->a , data->b , data->index的地址,发现data->a , data->b , data->index[0]相同,并且是先配分了低位地址,和第一个demo分析的结果一致,同时也可以看出来,0x01020304在内存中是高位字节放在高位地址,低位字节放在低位地址,是一个小端字节序。
3. 通过一个简单函数来判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
int check();
union Data{
char index[4];
int a;
char b;
};
int main(){
printf("check()=%d\n",check());
return 0;
}
int check(){
Data data;
data.a=1;
if(data.b==1){
return 1;
}else{
return 0;
}
}
因为data.a是int占用4字节,当data.a=1,在内存中应该是 0001 ,data.b是在data中最低地址
- 当data.b==1时,低字节放在低位地址,是小段
- 当data.b==0时,低字节放在高位地址,是大端