Спецификатор преобразования %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
для этой цели.