4 Stimmen

Warum definiert Apple UInt32 als long oder int je nach Plattform?

Ich habe festgestellt, dass UInt32 in MacTypes.h je nach Plattform unterschiedlich definiert ist.

#if __LP64__
typedef unsigned int                    UInt32;
typedef signed int                      SInt32;
else
typedef unsigned long                   UInt32;
typedef signed long                     SInt32;
#endif

Wenn unsigned int auf 32- und 64-Bit-Maschinen immer 32-Bit ist, warum überprüfen sie dann bedingt die Plattform?

3voto

Ken Thomases Punkte 85736

Der Typ UInt32 existierte bereits vor der Unterstützung von 64-Bit. Historisch gesehen wurde es als unsigned long definiert. Es hätte auch unsigned int sein können. Ich weiß nicht, warum damals long anstelle von int gewählt wurde. Die Wahl wäre größtenteils willkürlich gewesen.

Nachdem diese Wahl getroffen wurde, kann sie jedoch nicht geändert werden, obwohl unsigned int sowohl für 32- als auch für 64-Bit funktionieren würde.

Das große Problem, das sich ergeben würde, wenn es geändert würde, wäre C++. In C++ sind die Typen von Argumenten in die Symbolnamen in den Objektdateien und Bibliotheken eingebettet. long und int sind verschiedene Typen, daher sind void foo(long); und void foo(int); separate Funktionen mit separaten Symbolnamen. Wenn sich UInt32 in 32-Bit ändern würde, könnten Sie nicht mehr gegen Bibliotheken verlinken, die mit der alten Definition erstellt wurden. Wenn die Bibliotheken mit der neuen Definition neu erstellt würden, könnte der alte kompilierte Code sie nicht laden.

1voto

ouah Punkte 138337

Meine Vermutung ist, dass es sich um alten Code handelt, der ursprünglich war:

typedef unsigned long                   UInt32;
typedef signed long                     SInt32;

und später hat ein Entwickler das LP64 hinzugefügt und er tat dies, indem er die Zeilen hinzufügte:

#if __LP64__
typedef unsigned int                    UInt32;
typedef signed int                      SInt32;
#else

um keine Auswirkungen auf die vorherigen Plattformen zu haben.

Natürlich ergibt das nicht viel Sinn.

1voto

Pete Punkte 6465

Ein long ist garantiert mindestens 32 Bits groß. Ein int wird auf einem 16-Bit-Prozessor 16 Bits groß sein. Dies wird hier diskutiert http://en.wikipedia.org/wiki/C_data_types, unter anderem.

1voto

Die tatsächliche Größe von Ganzzahlentypen variiert je nach Implementierung. Der Standard verlangt nur Größenbeziehungen zwischen den Datentypen und Mindestgrößen für jeden Datentyp. Im Allgemeinen spiegelt sizeof(int) die "natürliche" Größe der Maschine wider. Auf einer 64-Bit-Maschine könnte int beispielsweise als 32 oder 64 Bits definiert sein; 32 Bits auf 32-Bit-Architekturen, 16 Bits auf 16-Bit-Maschinen. Der Standard gibt jedoch an, dass der int-Typ immer mindestens 16 Bits groß sein wird.

0voto

phuclv Punkte 31621

unsigned int ist nicht immer 32-Bit lang, es hängt vom Modell ab

  • Im LP64-Modell sind long und Pointer 64-Bit-Typen, int ist ein 32-Bit-Typ
  • Im ILP64-Modell sind int, long und Pointer 64-Bit-Typen

https://de.wikipedia.org/wiki/64-Bit-Computing#64-Bit-Datenmodelle

In anderen Modellen kann int eine beliebige Anzahl von Bits haben. Die einzige Einschränkung ist, dass es mindestens 16 Bits haben muss

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X