[英]Strange printf behavior
std::vector<DWORD64> v;
for(size_t i = init; i < pageSize; ++i)
v.push_back(i);
DWORD64 last = *(v.rbegin());
DWORD64 first = *(v.begin());
printf("%d %d \n", last, first);
printf("%d %d \n", first, last);
输出:
4095 0
0 0
我不明白为什么这个printf表现得那样? init或pageSize都不是0.我理解%d对无符号long long无效,但令我困扰的是当参数的顺序改变时printf的行为会发生变化。
init或pageSize都不是0。
对于64位值, %d
也不是合适的格式字符串说明符,我敢打赌:-)
更有可能的是,你需要使用%ld
(如果你的long是64位)或%lld
(如果你的long长度为64位)或者来自最新C标准的固定宽度说明符宏,我永远不会记得假设它们在您的环境中可用,我的头脑:-)
如果你接受C ++而不是许多程序员似乎存在的那种半边界(使用像stdio.h
这样的传统东西,当有更好的替代品可用时),整个问题可能会消失。 您应该使用类型感知:
std::cout << a << ' ' << b << '\n';
它还有助于使编译器有点智能,并确保您使用该智能:
pax$ cat qq.cpp
#include <iostream>
#include <vector>
#include <cstdio>
int main (void) {
std::vector<int> v;
v.push_back (111142);
v.push_back (314159);
long long a = *(v.begin());
long long b = *(v.rbegin());
printf ("%6d %6d, a then b, bad\n", a, b);
printf ("%6d %6d, b then a, bad\n", b, a);
std::cout << a << ' ' << b << ", good\n";
return 0;
}
pax$ g++ -Wall -Wextra -o qq qq.cpp
qq.cpp: In function 'int main()':
qq.cpp:11: warning: format '%d' expects type 'int', but argument 2
has type 'long long int'
qq.cpp:11: warning: format '%d' expects type 'int', but argument 3
has type 'long long int'
: : : : :
qq.cpp:12: warning: format '%d' expects type 'int', but argument 3
has type 'long long int'
pax$ ./qq
111142 0, a then b, bad
314159 0, b then a, bad
111142 314159, good
对于那些真正对机制有兴趣的人,为什么值会根据他们在printf
的顺序而变化,请参阅这个答案 。
它详细介绍了什么东西(更重要的是,这些东西的大小)被推到了堆栈上,将它们与你告诉printf
内容进行比较。
长话短说:你骗了printf
所以它对待你就像你的另一个人一样,如果你被抓到骗他们:-)
事实上,第一个printf last
打印了DWORD64变量的LO和HI DWORD(我相信这是4095)。 第二个printf打印出DWORD64变量的LO和HI个DWORD first
(其为0)。 两行中都忽略第二个DWORD64参数...
我的猜测是在你所针对的环境中%d
不适用于64位数量。 试试%I64
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.