Cast int to pointer - warum zuerst auf long setzen? (wie in p = (void *) 42;)

In demGLib Dokumentation gibt es ein Kapitel über Typkonvertierungsmakros. In der Diskussion um die Konvertierung einesint zu einem*void Zeiger heißt es (Hervorhebung von mir):

Naiv könnten Sie dies versuchen, aber es ist falsch:

gpointer p;
int i;
p = (void*) 42;
i = (int) p;

Auch dieses Beispiel war nicht korrekt, kopieren Sie es nicht.Das Problem ist, dass Sie dies auf einigen Systemen tun müssen:

gpointer p;
int i;
p = (void*) (long) 42;
i = (int) (long) p;

(Quelle: GLib Referenzhandbuch für GLib 2.39.92, KapitelTypkonvertierungsmakros ).

Warum ist das so?long notwendig?

Sollte eine Verbreiterung desint nicht automatisch als teil des casts auf einen zeiger passieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage