c-2.2.1.3-关于vc6.0中端格式的影响

先看一段程序:
        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        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不同,到时候应该注意区分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值