printf问题,网上找的

printf问题,网上找的

看看这个:

int main()
{
  long int i = 65536l;

  printf("%d, %ld", i, i);
  return 0;
}

在 TC 下的输出会是什么?我一开始以为是0, 65536,错!结果是0, 1!

分析一下:65536D = 00 01 00 00B,在内存中倒序存放成为00 00 01 00,然后入栈两
次,参数占就成了00 00 01 00 00 00 01 00。然后printf开始解析参数,看到第一个%d
,解析为int,只取参数前两个字节(16位)00 00,就成了0;看到第二个%ld,解析成l
ong,取接着的4个字节(32位)01 00 00 00,也就是说是1(别忘了倒过来,怪就怪int
el的破CPU吧,呵呵)!为了验证,可以写一个这样的程序:

int main()
{
  long int i = 0x12345678;

  printf("%x, %lx", i, i);
  return 0;
}

输出:5678, 56781234。

再次分析:参数在栈中的状态是78 56 34 12 78 56 34 12,printf解析第一个参数取到
78 56,也即5678;解析第二个参数取到34 12 78 56,即56781234。看来还不错,应该
就是这个原因了。

总结:看来以后使用不定参函数还要格外小心,万一参数类型不匹配,尤其是长度不匹
配的情况,可能导致的直接后果就是后面的参数全都乱套! 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值