Не существует полностью переносимого способа сделать это, и это неприятно.
C99 предоставляет механизм для встроенных типов, таких как size_t
с нотацией %zu
(и есть некоторые дополнительные, подобные классификаторы).
Он также предоставляет заголовок <inttypes.h>
с макросами, такими как PRIX32, для определения правильного квалификатора для печати 32-разрядной шестнадцатеричной константы (в данном случае):
printf("32-bit integer: 0x%08" PRIX32 "\n", var_of_type_int32_t);
Для системных типов (например, определенных POSIX), AFAIK, не существует хорошего способа их обработки. Итак, что я делаю, так это на лету догадываюсь о «безопасном» преобразовании, а затем печатаю соответственно, включая состав, что вы и иллюстрируете в этом вопросе. Это расстраивает, но лучшего способа, о котором я знаю, нет. В случае сомнений и использования C99 преобразование в «unsigned long long» довольно хорошо; может быть случай использования приведений к uintmax_t
и PRIXMAX или эквивалентным.
Или, как FUZxxl напомнил me, вы можете использовать модификатор j
для указания целочисленного типа 'max'. Например:
printf("Maximal integer: 0x%08jX\n", (uintmax_t)var_of_type_without_format_letter);