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 );输出是多少?”其实原理也是这样的,有兴趣可以推敲一下,结果就不说了,可以试试。(注意:这里有可能造成内存使用错误)