前两天看到大端小端时,
小端:低字节的值在前,高字节的值在后
大端:高字节的值在前,低字节的值在后
看到一个c的语言题,不是很清楚:
#include <stdio.h>
int main() { int a[5] = {1, 2, 3, 4, 5}; int* ptr1 = (int*)(&a + 1); int* ptr2 = (int*)((int)a + 1); printf("%x, %x/n", ptr1[-1], *ptr2); return 0; }
输出:
5, 2000000 对于输出5,比较好理解。&a是一个指向数组a的指针,也就是一个二级指针。至于为什么会是这样,我也不是很清楚了, 后面的&a + 1相当于 address(a[0]) + sizeof(int) * 5,也与此相关。 但输出2000000就不明白了。由于是与大小端相关的题目,我就先看看我的机子是大端还是小端,用的方法,很普遍的那种: typedef union un_t1 { int i; char ch; }un; un u1; u1.i = 1; if(u1.ch == 1) printf("It is littleendian./n"); else printf("It is big endian./n"); 结果,我的机子是小端的。 假设a[0]的地址是1,则在我的机子上,数组a的内存分布如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 则ptr2=2,又因为我的机子的字长为4个字节,所以*ptr2会一次读取2 3 4 5这四个字节的值 00 00 00 02,按照小端的内存分布规则----低字节的值在前,高字节的值在后----,所以*ptr2 的值为2000000。按照这种思维,测试一下: int* ptr2 = (int*)((int)a + 2); *ptr2 = 20000 int* ptr2 = (int*)((int)a + 3); *ptr2 = 200 int* ptr2 = (int*)((int)a + 4); *ptr2 = 2 int* ptr2 = (int*)((int)a + 5); *ptr2 = 3000000 果然与我预期一致。