Как напечатать f() для uint16_t?

Мне нужно использовать printf() для печати uint16_t. Этот ответ SO (Как распечатать значение переменных uint32_t и uint16_t ?) говорит, что мне нужно использовать inttypes.h.

Однако я работаю над встроенной системой, а inttypes.h недоступен. Как напечатать uint16_t, если спецификатор формата для uint16_t недоступен?


person user9993    schedule 18.03.2015    source источник
comment
printf(%u\n, (uint16_t)что-то);   -  person user3528438    schedule 18.03.2015
comment
Выясните, насколько широки различные целочисленные типы в вашей системе, и используйте соответствующий спецификатор.   -  person Kevin    schedule 18.03.2015
comment
@ user3528438: Нет, %u ожидает unsigned int, а не uint16_t. Актерский состав должен быть unsigned int.   -  person Keith Thompson    schedule 18.03.2015


Ответы (3)


Вы должны использовать стиль inttypes.h, но определять символы самостоятельно. Например:

#define PRIu8 "hu"
#define PRId8 "hd"
#define PRIx8 "hx"
#define PRIu16 "hu"
#define PRId16 "hd"
#define PRIx16 "hx"
#define PRIu32 "u"
#define PRId32 "d"
#define PRIx32 "x"
#define PRIu64 "llu" // or possibly "lu"
#define PRId64 "lld" // or possibly "ld"
#define PRIx64 "llx" // or possibly "lx"

Придумайте их для своей машины и используйте. Взгляните на другие в inttypes.h и нарисуйте, что вам нужно.

Таким образом, ваш код будет более переносимым. Я занимаюсь встраиваемыми системами с конца 70-х. Поверьте мне: портативность важна.

person Jeff Learman    schedule 15.06.2018
comment
Я не мог придумать лучшего ответа! Мобильность часто недооценивают. - person Michael Beer; 16.06.2018

Очевидный способ:

printf("%u\n", (unsigned int)x);

Беззнаковое целое гарантированно будет не менее 16 бит, так что это не преобразование с потерями.

person M.M    schedule 18.03.2015
comment
На самом деле все остальное было бы чрезмерной инженерией. - person chqrlie; 16.06.2018
comment
Если вы уверены, что тип никогда не изменится, это нормально. Большим преимуществом inttypes.h является то, что если вы измените тип данных, но забудете изменить строку формата, компилятор предупредит вас. С учетом вышеизложенного, если x изменить на uint64_t, старшие биты не будут напечатаны. По общему признанию, такое большое изменение не является обычным явлением, но оно происходит, например, когда значение представляет собой ключ, который меняется с серийного номера на UUID. При использовании таких ярлыков важен контекст. - person Jeff Learman; 04.02.2020

short int является наименьшим размером не менее 16 бит, поэтому преобразуйте значение в unsigned short int и напечатайте его с помощью %hu.

person StenSoft    schedule 18.03.2015