CPU端序(字节序)

小端: 低地址存放低位字节。(x86是小端模式

大端: 低地址存放高位字节。(非x86是大端模式

例1:看下面的几个字段

void testEndianMem(){
	char a[] = {0x12,0x34};
	short b = 0x5678;
	int c = 0x1a2b3c4d;
}


栈的按照地址的反方向增长,故存放到内存的情况应该是: 先存a,再存b,再存c。 因此c的地址最小,其次是b,其次是a。

内存中的情况如下图所示:

CPU端序(字节序)_第1张图片

 

单独看a,因为存放的类型是字节长度,故按照地址增长方向存放的是12,34。

在看b,b是两字节的类型,x86是小端,所以低地址存放最低字节,应该存放78,然后再存放56。

在看a,a是一个四字节的类型,x86是小端,所以低地址存放低字节,就应该先存放4d,然后接下来是3c,2b,1a。

例2: 我们已经知道各种长度类型的字段如果存到内存中了。

下面的例子看如果已经知道了内存中的内容。那么对于不同类型的指针,它是如何解释并输出的?

void testEndian(){
	char array[12] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
	
	short *pshort = (short *)array;
	int *pint = (int *)array; 
	printf("%x\n",*(pshort+1));	//0x0403
	printf("%x\n",*(pint+1));	//0x08070605
}

很明显,我们已经可以知道对于array数组来说,因为都是字节类型,所以在内存中的存放顺序严格按照这里的顺序递增,即和地址增长方向保持一致。

CPU端序(字节序)_第2张图片

那么这几个print语句会打印什么呢?

对于第一个打印语句,我们的指针是short型的,所以编译器认为我们存放的都是short值,会按照short的存储方式来解析。首先指针+1,走到03开始的位置,然后因为是小端,所以认为高字节在高地址处,低字节在低地址处,所以输出0x0403。(04是高字节,在高地址处,03是低字节,在低地址处)。

同理可以知道int类型的指针解释出来就是0x08070605。

你可能感兴趣的:(CPU端序(字节序))