[英]How do I find the width of a uint_fast32_t
我希望能夠移植fprintf()
一個uint_fast32_t
,如stdint.h
中定義的那樣,所有前導零。 例如,如果我的平台將uint_fast32_t
定義為 64 位無符號 integer,我想使用%016lX
之類的格式說明符fprintf()
,但如果它是 32 位無符號 Z157DB7DF530023575515D366C9B6708lX8,我想使用%08lX
。
我可以在某處使用像INTFAST32_BITS
這樣的宏嗎?
現在我正在使用
#if UINT_FAST32_MAX == 0xFFFFFFFF
# define FORMAT "08"PRIXFAST32
#elif UINT_FAST32_MAX == 0xFFFFFFFFFFFFFFFF
# define FORMAT "016"PRIXFAST32
#endif
但這僅適用於 32 位或 64 位寬的uint_fast32_t
,而且代碼也有點笨重且難以閱讀
您可以像查找任何其他類型的大小一樣查找uint_fast32_t
的大小:通過對其應用sizeof
運算符。 結果的單位是char
類型的大小。 例子:
size_t chars_in_a_uint_fast32_t = sizeof(uint_fast32_t);
但這對於使用printf
-family 函數之一進行打印是不夠的。 printf
等中出現未定義的行為。 人。 如果任何格式化指令與相應參數的類型不匹配,並且uint_fast32_t
的大小信息不足以進行正確匹配。
這是您在其他答案中已經描述的格式化宏的來源。它們為每種類型和轉換提供了適當的大小修飾符和轉換字母。 對於uint_fast32_t
的X
轉換,適當的宏是PRIXFAST32
。
您可以照常提供任何標志、字段寬度和精度。 如果您確實想使用適合uint_fast32_t
實際大小的字段寬度,那么一種合理的方法是利用選項來指定字段寬度作為參數傳遞(類型為int
) . 因此:
uint_fast32_t fast;
// ...
printf("%0*" PRIXFAST32 "\n", (int) sizeof(fast) * 2, fast);
然而,我注意到這似乎有點問題,因為您正在為比通常更廣泛的值做准備,您應該允許該類型的任何值變為。 printf
function 在任何情況下都不會打印比表達值所需的更少的數字,假設它確實是指定的類型,所以我傾向於簡單地使用一個足以容納 32 位整數的固定字段寬度(比如 8 )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.