2009-04-22 3 views
3

Каковы спецификаторы формата для printf при работе с типами, такими как int32_t, uint16_t и int8_t и т. Д.?Спецификаторы формата для целых чисел фиксированной ширины?

Использование% d,% i и т. Д. Не приведет к переносной программе. Использует ли макросы PRIxx лучший подход?

ответ

3

Использует ли макросы PRIxx лучший подход?

Насколько я знаю, да.

Редактировать: другое решение - это преобразование в тип, который по крайней мере такой же широкий, как тот, который вы хотите распечатать. Например, int имеет ширину не менее 2 байтов, чтобы напечатать int16_t с помощью printf("%d\n", (int)some_var).

0

Да, если вы используете новые типы, вы действительно должны использовать спецификаторы нового формата.

Это лучший способ сделать это с тех пор, как реализация уже проделала работу, чтобы гарантировать, что строки формата будут корректными для типов.

Так, например:

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

int main (void) { 
    int32_t i32 = 40000; 
    printf ("%d\n", i32);   // might work. 
    printf ("%" PRId32 "\n", i32); // will work. 
    return 0; 
} 

показывает как способы сделать это.

Однако на самом деле есть нет гарантия того, что первый сделает то, что вы ожидаете. Например, в системе с 16-разрядными типами int вы можете получить другое значение.

Смежные вопросы