2013-01-16 146 views
0

我有十六進制值0x5a800000000b,我試圖讓C中的printf語句將它打印到控制檯。C printf整數類型U32

到目前爲止,(因爲我用C沒用)我能得到「B」來打印,使用語法:

printf("Hex value%x\n", value); 

的值存儲在一個整數類型U32,但在嘗試%llx,%lx的所有不同組合後,我只是不斷收到編譯器警告。

我猜我得到的printf語法錯了,但我似乎無法找到正確的%選項,有人可以幫我嗎?

感謝

+0

您是否嘗試過'%ulx'或'%ullx'? – yiding

回答

6

這不是與printf一個問題。

問題是一個32位變量不能保存值0x5a800000000b。 32位只能保存8個十六進制數字:0x0000000b。因此輸出爲b

要存儲這麼大的值,應該使用64位變量。

long long value = 0x5a800000000bLL 

還要注意在最後的雙重L。它告訴編譯器該常量也是long long

然後您可以在printf格式字符串中使用%llx

+0

啊,是的,當然!我正在忙於printf,我忘了查看實際值有多大:)感謝Didier! – Tony

0

值0x5a800000000b多於32位,所以你必須使用long

long value = 0x5a800000000bl; 
printf("Hex value%lx\n", value); 

需要注意的是十六進制常量在l應該結束。

+0

或者可能很長。 – dbrank0

+0

@ dbrank0 - 取決於編譯器/環境。 –

+1

要獨立於平臺,只需在這種情況下使用'uint64_t'。 –

4

有這些類型的一些預定義宏:

#include <inttypes.h> 
int64_t PRId64. PRIi64 
int32_t PRId32, PRIi32 
int16_t PRId16, PRIi16 
int8_t PRId8, PRIi8 

例如:

printf("%"PRId32"\n", my32Int); 
+0

PRId62是錯字嗎? –

+0

糟糕,應該是PRId64。謝謝! –

+0

雖然這個問題是C,並且在C中使用inttypes宏沒有問題,但由於預處理器在C++中工作的方式,在這些宏和字符串文字之間包含空格可能是一種好的做法。如果沒有任何空格,預處理器將不會應用inttypes宏,因爲它會將其標識爲使用用戶定義的文字。 – bames53