void * + unsigned int

02/07/2009 - 15:00 von Robert Hartmann | Report spam
Hallo zusammen,

Gilt tatsàchlich immer die Gleichheit,
oder gibt es auch Systeme in denen die Größe
eines void-Pointer kleiner oder größer als ein unsigned int ist?

if (sizeof(void *) == sizeof(unsigned int))
{
printf("Ja, beide sind %d Bytes = %d Bits groß", sizeof(void *),
sizeof(void *)*CHAR_BIT);
}
else
{
printf("Nein, void* ist %d Bytes = %d Bits groß und unsigned int ist %d
Bytes = %d Bits groß", sizeof(void *), sizeof(void *)*CHAR_BIT,
sizeof(unsigned int), sizeof(unsigned int)*CHAR_BIT);
}

Gruß Robert
 

Lesen sie die antworten

#1 Juergen Ilse
02/07/2009 - 15:30 | Warnen spam
Hallo,

Robert Hartmann wrote:
Gilt tatsàchlich immer die Gleichheit,
oder gibt es auch Systeme in denen die Größe
eines void-Pointer kleiner oder größer als ein unsigned int ist?



Selbstverstaendlich gibt es solche Systeme. Schlimmer noch: es gibt Compiler-
Umgebungen, bei denen selbst "unsigned lond" nicht ausreicht, um einen Pointer
verlustfrei aufnehmen zu koennen. Fuer ersteres sind viele 64-Bit-Systeme bei
denen aber int nach wie vor nur 32 Bit breit ist ein Beispiel (findet man z.B.
bei Sparc oder auch AMD64). Fuer letzteres ist mir moentan nur ein Beispiel
bekannt (es kann aber durchaus noch mehr solche geben): der WATCOM C-Compiler
fuer DOS mit segmentiertem 32-Bit-Memory-Model, denn dort bestanden Pointer
aus 16 Bit Segment-Anteil und 32 Bit Offset-Anteil, waehrend unsigned long
nur 32 Bit breit war (also nicht mehr als den Offset-Anteil eines Pointers
aufnehmen konnte).

if (sizeof(void *) == sizeof(unsigned int))
{
printf("Ja, beide sind %d Bytes = %d Bits groß", sizeof(void *),
sizeof(void *)*CHAR_BIT);
}
else
{
printf("Nein, void* ist %d Bytes = %d Bits groß und unsigned int ist %d
Bytes = %d Bits groß", sizeof(void *), sizeof(void *)*CHAR_BIT,
sizeof(unsigned int), sizeof(unsigned int)*CHAR_BIT);
}



Beim Watcom C-Compiler mit dem oben erwaehnten Memory-Model haette es selbst
dann keinen integer-Typ gegeben, der *genau* *so* *breit* wie ein Pointer
gewesen waere, wenn der compiler "long long unsigned int" gekannt haette
(keine Ahnung, ob das der Fall war), denn dann waere "long unsigned" kleiner
als ein Pointer gewesen, waehrend "long long unsigned" groesser als ein
Pointer gewesen waere ...

Tschuess,
Juergen Ilse ()
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...

Ähnliche fragen