gcc的printf一个诡异的bug
本人在linux gcc环境下发现一个printf的诡异现象,各位大牛们来看看是咋回事?
代码:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint64_t x = 566;
uint64_t y = 343;
uint64_t z = 980;
printf( "x=%ld\n", x );
printf( "y=%ld\n", y );
printf( "z=%ld\n", z );
printf( "x=%ld, y=%ld, z=%ld\n", x, y, z);
printf( "x=%ld, y=%ld, z=%ld\n", 566, 343, 980);
}
运行结果:
x=566
y=343
z=980
x=566, y=0, z=343
x=566, y=343, z=980
printf输出三个64位整数时,y怎么就变成了0???
kaien
11 years, 6 months ago
Answers
这个不是bug,printf用%ld和用%d输出都是表示输出32位整数,要输出64位整数,在gcc下面应该是要使用%lld(VC下面好像是%i64d的样子)
你的格式描述符写的是32位整数,但编译器不会检查,编译器仍然为你压进了一个64位整数到栈里。由于是小端格式,当这个数不超过32位范围时,程序取了低32位,刚好就是你要输出的数。
但当同时输出多个数的时候就不一样了,编译器压进了3个64位数,程序却取了3个32位数,因此第一个输出取到了第一个64位数的低32位(是你要输出的数);第二个输出取到了第一个64位数的高32位(在你这个例子中就是0);第三个输出取到了第二个64位数的低32位(所以是你想输出的第二个数)。
所以这个输出结果是完全符合逻辑的,只是你使用printf的方法有问题。
提督如月末
answered 11 years, 6 months ago