[英]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.