C: printf с typedef unsigned long long int - PullRequest
0 голосов
/ 06 мая 2020

У меня есть typedef, который содержит 64-битный адрес памяти в шестнадцатеричном формате, но использование %x с printf дает мне следующую ошибку:

error: format '%x' expects argument of type 'unsigned int', but argument 4 has type 'address'\

Это мое объявление typedef:

typedef unsigned long long int address;

Как распечатать это шестнадцатеричное значение? Спасибо!

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

1 Ответ

4 голосов
/ 06 мая 2020

Спецификатор преобразования %x ожидает, что его соответствующий аргумент будет иметь тип unsigned int. Чтобы напечатать unsigned long long, вам нужно использовать модификатор длины ll или %llx.

Handy Table

Length Modifier        Type
–––––––––––––––        ––––
             ll        (unsigned) long long
              l        (unsigned) long
              h        (unsigned) short
             hh        (unsigned) char
              j        intmax_t, uintmax_t
              z        size_t
              t        ptrdiff_t
              L        long double

Итак, чтобы отформатировать значение unsigned char как шестнадцатеричное, вы должны использовать %hhx или %hhX. Чтобы отформатировать short как десятичное, вы должны использовать %hd. Чтобы отформатировать unsigned long как восьмеричное, вы должны использовать %lo.

Беспричинная тирада

Вы только что показали, почему я стараюсь избегать использования возможности typedef для примитивных типов.

Вы создали то, что известно как дырявая абстракция - вы якобы создали новый тип для представления значения адреса, но вы должны знать, что он был реализован как unsigned long long, чтобы использовать его правильно.

Если вы собираетесь создать абстрактный тип, вам нужно go полностью и создать абстракции (функции, макросы и т. Д. c.) Для всех операций с этим типом, включая ввод и вывод. (и присваивание, и проверка и т. д. c.).

Обычно это не стоит усилий для примитивных типов, поэтому я бы избегал использовать typedef для этой цели.

...