Max. Wert von intptr_t (INTPTR_MAX) und PRIdPTR

16/09/2008 - 20:47 von Dominik Schäfer | Report spam
Huhu,

ich hab mal eine Frage zum Typ intptr_t und seinem oberen Limit
INTPTR_MAX bzw. wie jenes definiert sein sollte.
Auf meinem System (MacOS 10.5.x, i686-apple-darwin9-gcc-4.2.1) ist
intptr_t ein 'long' und PRIdPTR dementsprechend als "ld" definiert.
Merkwürdigerweise ist INTPTR_MAX jedoch als 2147483647 (INT32_MAX,
i386) bzw. 9223372036854775807LL (INT64_MAX, x86_64) definiert.
Naiv haette ich nun erwartet, dass es als 2147483647L bzw.
9223372036854775807L definiert wàre.
Haltet ihr das fuer einen Fehler in stdint.h oder ist so eine
Definition durchaus von C99 abgedeckt oder gar sinnvoll?

Viele Grüße,
Dominik
 

Lesen sie die antworten

#1 Thomas Richter
19/09/2008 - 14:01 | Warnen spam
Dominik Schàfer wrote:

ich hab mal eine Frage zum Typ intptr_t und seinem oberen Limit
INTPTR_MAX bzw. wie jenes definiert sein sollte.
Auf meinem System (MacOS 10.5.x, i686-apple-darwin9-gcc-4.2.1) ist
intptr_t ein 'long' und PRIdPTR dementsprechend als "ld" definiert.
Merkwürdigerweise ist INTPTR_MAX jedoch als 2147483647 (INT32_MAX,
i386) bzw. 9223372036854775807LL (INT64_MAX, x86_64) definiert.
Naiv haette ich nun erwartet, dass es als 2147483647L bzw.
9223372036854775807L definiert wàre.



2147483647 ist ein int, welches auf einem 32-bit gcc genauso breit wie
ein long ist (und somit funktioniert), 9223372036854775807LL ist ein
long-long, welches auf einem 64-bit gcc genauso breit wie ein long ist -
aus diesem Grunde "klappts".

Das Ursache liegt vermutlich ein wenig abseits, nàmlich dass INT32_MAX
ja in der Tat der Maximalwert für "int32_t" und nicht für "long" sein
soll, und insofern die Konstante wirklich eine int-Konstante sein sollte
- intptr_t "borgt" sich hier also die Maximalwerte von anderen Typen
aus, und hierdurch kommt es zu dieser Inkonsistenz. Für den gegebenen
Compiler besteht aber kein Problem.

Grüße,
Thomas

Ähnliche fragen