Posts 字节序
Post
Cancel

字节序

1. 基本概念

  1. 字节序就是超过一个字节的数据类型在内存中的存放顺序,通常需要在跨平台和网络相关的开发中需要留意的问题
  2. 字节序不是由操作系统决定的,而是由CPU架构所决定的

2. 大小端

字节序被分为两个类型

  1. 大端:高位字节排放在内存的低地址端低位字节排放在内存的高地址端
  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时,低字节放在高位地址,是大端

This post is licensed under CC BY 4.0 by the author.

MessageQueue分析

结构体对齐