Можно использовать z
для size_t и t
для ptrdiff_t как в [1 115]
printf("%zu %td", size, ptrdiff);
, Но в моей странице справочника говорится, что некоторая более старая библиотека использовала другой символ, чем z
и препятствует использованию его. Тем не менее, это стандартизировало (по стандарту C99). Для тех intmax_t
и int8_t
из stdint.h
и так далее, существуют макросы, которые можно использовать, как другой сказанный ответ:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
Они перечислены в странице справочника inttypes.h
.
Лично, я просто бросил бы значения к unsigned long
, или long
как другой ответ рекомендует. Если Вы используете C99, то Вы можете (и если, конечно) бросок к [1 111] или long long
, и используйте %llu
или %lld
форматы соответственно.
Какую версию C Вы используете?
В C90, общепринятая практика состоит в том, чтобы бросить к со знаком или длинному неподписанному, как соответствующая, и печать соответственно. Я видел %z для size_t, но Harbison и Steele не упоминают это под printf (), и в любом случае который не помог бы Вам с ptrdiff_t или что бы то ни было.
В C99, различные типы _t идут со своими собственными printf макросами, таким образом, что-то как "Size is " FOO " bytes."
я не знаю детали, но это - часть довольно большого числового формата, включают файл.
Вы захотите использовать макросы форматирования от inttypes.h.
Посмотрите этот вопрос: строка Кросс-платформенного формата для переменных типа size_t?
Как я вспоминаю, единственный портативный способ сделать это, должен бросить результат к "неподписанному длинному целому" и использованию %lu
.
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
Смотря man 3 printf
на Linux, OS X и OpenBSD вся выставочная поддержка %z
для size_t
и %t
для ptrdiff_t
(для C99), но ни один из тех не упоминает off_t
. Предложения в дикой природе обычно предлагают %u
преобразование для off_t
, который "достаточно корректен" насколько я могу сказать (и unsigned int
и off_t
, варьируются тождественно между 64-разрядными и 32-разрядными системами).
используйте "% zo" для off_t. (восьмеричное) или "% zu" для десятичного числа.