Почему PRIx16 не равен “hx”?

Почему PRIx16 == "x" в C (и на C ++ ) в GCC?

Я ожидаю, что это будет "hx" , так что следующие работы:

 #include  int16_t v = -1; printf("%04" PRIx16 "\n", v); // prints ffffffff, not ffff 

Короткий ответ:

Для печати подписанных типов используйте d , i .

Для печати неподписанных типов используйте x , u , o .


int16_t vцелочисленный тип со int16_t v .

PRIxN как в PRIx16 указан как «macros fprintf для целых чисел без знака». PRIxN не указан для «макросов fprintf для целых чисел со PRIxN ». @ Kerrek SB

Чтобы напечатать v , как десятичный текст, используйте PRId16 или PRIi16 .

 printf("%04" PRId16 "\n", v); 

Чтобы напечатать v в виде шестнадцатеричного текста, добавьте / преобразуйте в какой-то неподписанный.

 printf("%04" PRIx16 "\n", (uint16_t)v); 

Я также ожидал бы "hx" для PRIx16 и это способ с моей компиляцией GCC (GNU C11 (GCC), версия 6.4.0), но это, скорее, проблема с стандартной версией библиотеки (mine: ldd (cygwin) 2.9.0) , У меня есть сомнения относительно актуальности компилятора / библиотеки OP.

 #include  #include  int main(void) { printf(PRIx16); return 0; } 

Выход

 hx