2013-02-01 50 views
0

我試圖在Visual C不能適合所有的8個字節爲無符號長長

unsigned long long test = 0x1A2A00DABABA7890; 
printf("long long value %X\n", test); 
printf("%d", sizeof(test)); 

我的輸出表明它是8個字節,但只存儲第一,以適應16個進制值到一個unsigned long長4個字節 它輸出

long long value BABA7890 
8 

我誤解是如何工作的?謝謝你的幫助。

回答

4

您的printf格式說明符與您的類型不匹配,導致未定義的行爲。嘗試:

printf("long long value %llX\n", test); 

%d是一個sizeof結果的格式不正確了。你應該在那裏使用%zu

你的編譯器會警告你,如果你把一些警告設置(clang的默認操作爲例):

example.c:6:30: warning: format specifies type 'unsigned int' but the argument 
     has type 'unsigned long long' [-Wformat] 
    printf("long long value %X\n", test); 
          ~^  ~~~~ 
          %llX 
example.c:7:14: warning: format specifies type 'int' but the argument has type 
     'unsigned long' [-Wformat] 
    printf("%d", sizeof(test)); 
      ~^ ~~~~~~~~~~~~ 
      %ld 
2 warnings generated. 

編輯:我在你的問題發現你使用Visual C. %z是一個C99功能,可能不被編譯器支持。在這種情況下,您應該檢查文檔以查看使用的正確格式。

0

unsigned long long的正確格式說明符是llX(這是ell-ell,而不是十一)。

從標準:

LL(ELL-ELL):用於指定後續dioux,或X轉換說明適用於long long intunsigned long long int參數;或者以下n轉換說明符適用於指向long long int參數的指針。

0

它是正確存儲,但不打印得當

對於一個unsigned long長,你需要使用LLX%

-1

你需要指定整數的寬度。默認情況下,printf將假定它是32位。使用I64前綴,如下所示:

printf(「long long value%I64X」,test);

這是記錄在這裏爲Visual C/C++:

http://msdn.microsoft.com/en-us/library/vstudio/56e442dc(v=vs.100).aspx

+0

我相信I64是MSVC的,並不符合標準。 –

+0

@Timothy,OP說他在使用Visual C. –

相關問題