printf打印变量为零的问题

    printf打印变量,有时候会莫名的输出零,让人很是费解,今天就遇到一个问题,VC下的64位变量,打印方式为%d时,放在另一个需要打印变量的前面输出时,后一个变量值就会是零。例如:

__int64 iTestOne = 100;

int iTestTwo = 200;

printf( "TestOne = %d, TestTwo = %d/n", iTestOne, iTestTwo );

 

输出结果是:

TestOne = 100, TestTwo = 0

 

    上网查了查,发现原来是64位变量按照%d格式打印输出造成的。在VC下,如果是64位变量,最好使用%I64d的格式控制方式打印,就不会有问题了。

    在Linux下,64位变量是定义为long long型的,输出打印使用%lld格式控制,VC6下不支持long long类型,但是VS2005下好像支持了这种类型的变量。总之遇到这种64位变量要格外注意一下。

    再深究一下,发现printf在按照格式输出时,函数会自动取变量周围的内存值匹配格式后输出打印。因为iTestTwo先压栈,iTestOne后压栈,这样输出的时候,iTestOne的高32位为零,低32位为100,这样按照%d的方式打印,先出栈低32位,输出100,然后TestTwo = %d任然输出32位,这样就是iTestOne的高32位,自然打印值为0。做以下实验:

 

__int64 iTestOne = 0x0000000100000002;

int iTestTwo = 200;

printf( "TestOne = %d, TestTwo = %d/n", iTestOne, iTestTwo );

 

输出结果是: TestOne = 2, TestTwo = 1

    显然正是压栈的结果。

 

    看见论坛上有这样一道题:“printf( "Answer = %f/n", 10/3 );输出是多少?”其实原理也是这样的,有兴趣可以推敲一下,结果就不说了,可以试试。(注意:这里有可能造成内存使用错误)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值