2017-05-26 21 views
2

假設我有,例如,uint32_t類型的變量i。打印出來的預期的方法是這樣的:在預期PRIu32的printf格式字符串中使用%lu是否有效?

printf("%"PRIu32"\n", i); 

但是,應該指出的是,它需要long unsigned int至少爲32位寬。 long unsigned int的正確說明符是%lu。因此,上面的陳述可以被替換爲:

printf("%lu\n", i); 

我想是的,因爲我看不到沒有理由。然而,如果是的話,那麼這將消除像PRIu32這樣的宏化指定符的存在需要,所以我想我最好問。

我問這個問題的原因是我想動態地爲printf創建一個格式字符串,如果我不知道字符串的大小,就很難爲這個格式字符串分配空間PRIu32擴展爲(以及sizeof(PRIu32)是否有效可能值得單獨提問)。

在任何情況下,我想這應該是有效的寫:

printf("%lu\n", (long unsigned)i); 
+0

您的以下C99或C89標準是什麼? – LethalProgrammer

+0

@LethalProgrammer C11。 – gaazkam

+0

好的,你已經得到了答案。 – LethalProgrammer

回答

7

因此,可以在上面的語句替換爲:

printf("%lu\n", i); 

我想是的,因爲我可以看到沒有理由爲什麼不。

沒有,因爲long unsigned int可以更大超過32位,或者如果恰好32位仍然可以有不同的表示比確實uint32_t

在任何情況下,我想這應該是有效的寫:

printf("%lu\n", (long unsigned)i); 

是的,正如你觀察到的,這也是安全,因爲long unsigned int需要能夠代表uint32_t可以採用的所有值。

+0

在什麼情況下,實現可以定義'uint32_t'並且有一個32位的'unsigned long'('long unsigned int'是'unsigned long'的替代名稱),但是卻有不同的表示? §7.20.1.1_Exact integer types_表示如果實現支持它作爲32位補碼錶示並且沒有填充位,則只應定義「int32_t」,並且「uint32_t」是相應的無符號類型。如果機器使用補碼或符號大小,則不應定義精確寬度的整數類型。但是,這是爲了「不同的表現」。 –

+1

@JonathanLeffler該標準並不要求只有一個整數類型具有任何給定的大小和符號組合,或者兩個這樣的類型共享一個共同的表示。例如,可能有兩種不同字節順序的這種類型,或者不同數量的填充位。這些都可以是標準整數類型(例如'unsigned int'和'unsigned long'),或者可以是實現的擴展整數類型之一。 –

+0

好的 - 我不打算追逐這種可能性的標準。他們太古怪了,如果你遇到過,我會感到驚訝,如果你曾經遇到過,我會感到非常驚訝。 –

相關問題