内存地址、大端小端问题

内存地址

一个内存地址可存储 8 bit = 1 byte(字节)

32位操作系统可寻址空间为 2^32 (Byte) = 2^10 * 2^10 * 2^10 *4 = 4 GB

数据所占内存大小

C声明 字节数 字节数
有符号 32位 64位
char 1 1
short 2 2
int 4 4
long 4 8
char* 4 8
float 4 4
double 8 8

大端小端

32bit宽的16进制 0x12345678 在内存中的存放方式:

大端: 高字节存储在低地址,低字节存储在高地址

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x12 0x34 0x56 0x78

小端: 低字节存储在低地址,高字节存储在高地址

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12

union 共用体

任何时刻共用体中只存放了一个被选中的成员

所有成员都从低地址开始存放

结构体和共用体的区别在于:
结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

判断大端小端

#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1

int TestByteOrder(){
	short int word = 0x0001;
	char* byte = (char*) &word;//自地址总是指向低地址,&word 即为字地址
	return (byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN );
}

#include <iostream>
using namespace std;

union TEST{
	short a;
	char b[sizeof(short)];
};

int maint(){
	TEST test;
	test.a = 0x0102;
	if(test.b[0] == 0x01 && test.b[1] == 0x02){
		cout << "big endian."<< endl;
	}	
	else if(test.b[0] == 0x02 && test.b[1] == 0x01){
		cout << "little endian" << endl;
	}	
	else{
		cout << "unknown" << endl;
	}
	return 0;
}

栈地址生产方式:从高地址到低地址

  • 先分配的变量存在高地址,后分配的存在低地址
  • 栈空间由编译器开辟和释放,主要存放局部变量和函数参数

猜你喜欢

转载自blog.csdn.net/weixin_39554266/article/details/83578954
今日推荐