Нет необходимости предотвращать усечение вашего указателя.
При компиляции для 64-битного указатель будет иметь 64-битный размер. Это означает, что он содержит число типа 0x0123456789ABCDEF
.
Тем не менее, выходной форматер %p
отбрасывает любые начальные 0, поскольку они не изменяют поведение вашей программы. Это похоже на сравнение 0x42==0x0042
.
Вам не нужно преобразовывать свой адрес в шестнадцатеричный, чтобы использовать его в качестве указателя.
Компьютер сохраняет ваш адрес в двоичном формате , В памяти ваш адрес 200000000
будет сохранен как 0b1011111010111100001000000000
.
Выходной формат десятичного и шестнадцатеричного используется только для того, чтобы людям было удобнее читать выходные данные.
Компьютер не заботится, если вы вводите десятичные, шестнадцатеричные или двоичные числа, в памяти он всегда будет работать с двоичным представлением.
Это означает, что вы можете напрямую следовать совету вашего связанного ответа
#include <inttypes.h> // defines PRIxPTR, see comments of @chqrlie and @JonathanLeffler
uintptr_t address= 200000000; // compiler makes sure to convert this to binary for the pc
uint32_t *Pointer = (uint32_t*) address;
printf("0x%" PRIxPTR " address\n", address); // if the ptr size is known, e.g. %lx can be used
printf("%p pointer\n", Pointer);
sprintf
преобразует ваше число в Строка ASCII и сохраняет это в бафф. Это означает, что вы не можете разыграть содержимое баффа, чтобы вернуть число. Вам необходимо преобразовать строку в int или строку в шестнадцатеричное ранее.
Edit:
Вы можете проверить преобразование вашего компилятора, напечатав следующие операторы сравнения
printf("%d\n", address == 200000000); // output true
printf("%d\n", address == 0xbebc200); // output true
printf("%d\n", address == 0x00000bebc200); // output true
printf("%d\n", address == 0b1011111010111100001000000000); // output true