2016-12-16 45 views
0

在Visual Studio 2012中,如果運行下面的代碼我得到的輸出作爲下面提到爲什麼輸出是這樣在Visual Studio 2012

typedef unsigned short  u16; 
typedef unsigned long long  u64; 
int main() 
{ 
    u16 i = 10; 
    u64 j = 1000; 
    printf("i= %d, j= %lu\n", i, j); 
    printf("j= %lu, i= %d\n", j, i); 
    getchar(); 
} 

output: 
i = 10, j = 1000 
j = 1000, i = 0 

//爲什麼?

+2

使用'%llu'作爲'unsigned long long'。 – BLUEPIXY

+0

我假設你問爲什麼'我'從'10'變爲'0'?看起來像一個錯誤。 Clang和GCC都沒有表現出這種行爲。 –

+0

使用MSVC模式[這裏](http://rextester.com/l/cpp_online_compiler_visual),我注意到從'%lu'切換到'%llu'修復了輸出。不過,我不確定格式說明符爲什麼會影響我如何打印。 –

回答

2

您通過unsigned long longj)至printf()(8字節)。但是,由於格式說明符不正確(%lu應該是%llu),printf()只讀取其中一半(最低有效4個字節)。其他4個字節由printf()解釋爲%d(而不是被忽略的i)。 1000的所有4個最高有效字節都是0

由於該值與其說明符的字節數不匹配,因此爲Undefined Behaviour

第一個printf()正常工作,因爲它恰巧發生printf()讀取的j的4個字節是最不重要的字節。將一個大於2^32的數字放入j,並且在printf()這兩次調用中都會得到錯誤結果。

相關問題