C++菜鸟:Intel CPU对内存数据的读写是小端模式,你搞明白没有?

文章目录

        • 上代码,看小端

转载注明出处: 所有的原因分析都在代码块中了,仔细阅读哦!

上代码,看小端

int main() 
{
	//int s = 0x61626364; // 0x61是数据高字节 0x64是数据低字节
	// Intel CPU对于内存数据的读写是小端模式,即数据的高字节存在内存的高地址,因此数据存储如下
	// 内存低地址    0x64 0x63 0x62 0x61  内存高地址
	//char _s = char(s);
	//std::cout << _s << "\n";//输出d,取的是最低地址的数据,所以输出的是内容:0x64,正好对应字符d


	//int a = 0x12345678; // Intel CPU的数据的存储是小端序(数据的高字节即:12存在内存的高地址处),
	//因此具体的数据在内存中的存储请看下一行
	 Intel CPU的内存存储(由低地址到高地址)为:78 56 34 12
	//char* p = (char*)(&a);//指向第一个低地址
	//printf("%x\n", *(p + 1)); //指针值加1,所以取到的值是56

	char str[] = "0123456789";
	char* sz = str;
	printf("%p,%p\n", str, sz+1);
	printf("start_char=%c,next=%c\n", *sz,*(sz+1)); //结合两条printf的输出结果可以看到,0放在低地址,1放在高地址
	// 字符‘0’的ASCII码是十进制的48,48的16进制是0x30, ‘1’是0x31,以此类推
	// str在内存中的存储ru如下:
	// 内存低地址-------->内存高地址
	// 0x30,0x31,0x32,0x33, 0x34,0x35,0x36,0x37, 0x38,0x39
	int* p = (int*)sz;//此时p指向sz所在空间的最低地址,那么连续的数据为:0x30,0x31,0x32,0x33
	// p指针加1,移动4个字节,所以连续的可访问数据为: 0x34,0x35,0x36,0x37
	// 因为Intel CPU是小端序(数据的高字节存放在内存的高地址端): condition_1
	// 同时规定数据的最左端为数据的高字节: condition_2
	// 根据condition_1和condition_2,就可以推出(*++p)的输出数据为:37363534   (数据的高字节--->数据的低字节)
	// 所以输出37363534
	printf("%x\n", *++p);
	return 0;
}

你可能感兴趣的:(C++基础)