一个典型代码的分析

 某论坛有人提出以下问题:

#include <iostream>
using namespace std;
int main()
{
    unsigned int a = 0x000000f7;
    unsigned int *p = &a;
    char *b = (char *)&a;
    printf("%08x/n",*p);
    printf("%08x",*b);
    return 0;
}
 
问:为什么*p,*b的输出结果不一样,若把a改为0x00000017,则输出结果一样。。。

我的解答:

根本原因,符号位扩展。

 

更详细点,可以概括为以下两点:

(1)32位cpu的栈是4字节对齐的,所以任何小于4字节的数据圧栈都要转化为4字节压入。所以,这就有了字节扩展的可能。关于字节扩展,有符号数的编译器以符号位扩展,无符号的以0扩展高位。

(2)printf是含有不定参数的。那么,这个函数如何确定自己本身有多少参数呢?其实奥秘就在与最前面的字串"%08x",对这个字串进行扫描,就可以确定后面有多少个参数,但参数的字节则无法确定,所以,取出来的数据必然是32位的,然后经过相应的处理输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值