Я думаю, что даже long int
небезопасно, и вы должны попробовать long long int
, который должен существовать, потому что вы работаете над 64-битной архитектурой, и у вас уже есть intptr_t
.
На некоторых 64-битная архитектура (я думаю, что Microsoft Windows так и будет), long int
может храниться в 32-битной ширине, чтобы соответствовать предположению возраста MS-DOS, что short int
всегда 16-битный, а long int
всегда 32-bit.
Даже на тех платформах с 32-битной long int
, printf("%llx", (unsigned long long)AAA);
будет работать.И вам следует рассмотреть более предпочтительную форму printf("%jx", (uintmax_t)AAA);
, если это возможно.
Обратите внимание, что для некоторых старых компиляторов вам может понадобиться использовать "%Lx"
(для GNU C, с приведением к unsigned long long
) или "%I64x"
(для Visual C ++ с приведением к __uint64
) для 64-разрядных целых чисел.
PS %p
в этом случае может оказаться неэффективным, поскольку %p
может печатать голое слово 0x
перед шестнадцатеричными числами и/ или может напечатать заполненное нулями значение.Например, если применяются оба варианта, код printf("%p\n", (void*)16);
будет печатать 0x00000010
на 32-битных платформах и 0x0000000000000010
на 64-битных платформах;постер должен был надеяться, что будет напечатано 10
.