¿Por qué se extiende el signo del puntero de 32 bits cuando se convierte a uint64_t?

Cuando se compila como un proceso de 32 bits, se imprime el siguiente códigoffffffff82223333 en lugar de82223333, por lo que parece que un puntero siempre tiene un signo extendido cuando se convierte auint64_t. ¿Porqué es eso?

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

int main()
{
    void *p = (void*) 0x82223333;
    uint64_t x = (uint64_t) p;
    printf("%llx\n", x);
}

Pensé que una dirección nunca puede ser negativa, por lo que debe tratarse como sin firmar.

Mi pregunta también está relacionada con estopregunta (porque los identificadores de Windows son solo typedefs para punteros).

Pregunta similar, pero aún no hay explicación de por qué los desarrolladores del compilador eligen hacer esto.

Respuestas a la pregunta(0)

Su respuesta a la pregunta