先看一段程序:
char a[] = {0, 0, 0, 4};
char *b;
b=a;
printf("%d",
*(long int *)b + 2);
printf("\n%d",sizeof(int));
对于第一句:定义了一个char型数组,在内存中的分配为:
位数: 7 6 5 4 3 2 1 0 76543210 76543210 76543210
内容: 0 0 0 0 0 0 0 0 0000 0000 0000 0000 0000 0
100
数字: 0 0 0 4
地址: 0000 (&a) --> 0001
-->
0002
-->
0003
共占用了四个字节,这样的话和vc6.0中一个long int 类型的参数所占的空间是相同的,所以咱们可以通过指针
的强制类型转换转换为long int型,让编译器对a开始的四个字节做一个int型的解读,
printf中的表示
*(long int *)b ,即将b开始的4个字节做一个int型的解读。
得到的结果如下:
,对结果转换为2进制为
最高位1所在的位置为26位
下面咱们分析一下结果产生的原因:(
intel使用小端格式,高字节在高地址,低字节在低地址。)
进行强制类型转换后,vc6.0编译器把b开始的4个字节解读如下:
地址:
0003
-->
0002
-->
0001
-->
0000
位数: 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
数据:0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
即,
vc6.0编译器按存储位置由高位到低位来解释int型数字,高位地址中的数据权重高,低位地址中的数字权重低
注意:不同的编译器对数据的解释不一样,比如gcc对数据的解释就有可能和vc不同,到时候应该注意区分。