2010-06-06 8 views

Antwort

14

IIRC, long auf dem iPhone/ARM ist 32 Bit. Wenn Sie eine garantierte 64-Bit-Ganzzahl wünschen, sollten Sie (tatsächlich) int64_t verwenden.

+0

Ja, NSInteger wird der native Worttyp sein. – Chuck

+0

Auf x86 'long' ist auch 32-bit. – kennytm

+0

@KennyTM: Das hängt vom Betriebssystem und den Compilern ab, nicht nur von der Hardware. –

0

Wenn Sie eine bestimmte bekannte Größe benötigen, verwenden Sie den Typ mit der bekannten spezifischen Größe: int64_t. Wenn Sie einen generischen Integertyp benötigen und die Größe nicht wichtig ist, gehen Sie voran und verwenden Sie int oder NSInteger.

0

NSInteger's Länge hängt davon ab, ob Sie für 32 Bit oder 64 Bit kompilieren. Es ist definiert als lang für 64 Bit und iPhone und Int für 32 Bit.

Also auf iPhone die Länge von NSInteger ist die gleiche wie die Länge einer langen, die compilerabhängig ist. Die meisten Compiler haben die gleiche Länge wie das ursprüngliche Wort. d.h. 32 Bit für 32-Bit-Architekturen und 64 Bit für 64-Bit-Architekturen.

Angesichts der Unsicherheit über die Breite von NSInteger, verwende ich es nur für Arten von Variablen in der Cocoa API verwendet werden, wenn NSInteger angegeben ist. Wenn ich einen Typ fester Breite brauche, gehe ich zu den in stdint.h definierten. Wenn mir die Breite egal ist benutze ich die eingebauten Typen

0

Wenn Sie etwas so lange deklarieren wollen, deklarieren Sie es als lang. Beachten Sie, dass je nach Compiler 32 oder 64 Bit lang sein können.

Wenn Sie etwas so effizient wie möglich und groß genug zum Zählen von Elementen deklarieren möchten, verwenden Sie NSInteger oder NSUInteger. Beachten Sie, dass beide 32 oder 64 Bits lang sein können und je nach Compiler tatsächlich unterschiedliche Typen (int oder long) sein können. Das schützt Sie in manchen Fällen vor Verwechslungen.

Wenn Sie 32 oder 64 Bit und nichts anderes möchten, verwenden Sie int32_t, uint32_t, int64_t, uint64_t. Beachten Sie, dass jeder Typ bei einigen Compilern unnötig ineffizient sein kann.

2

Integer-Datentypen Größen

  • short - ILP32: 2 Byte; LP64: 2 Byte

  • int - ILP32: 4 Byte; LP64: 4 Byte

  • long - ILP32: 4 Byte; LP64: 8 Bytes

  • long long - ILP32: 8 Bytes; LP64: 8 Byte

kann es nützlich sein zu wissen, dass:

Der Compiler definiert die __LP64__ Makro, wenn für die 64-Bit-Laufzeit zu kompilieren.

NSInteger ist ein typedef von long so wird es 32-Bits in einer 32-Bit-Umgebung und 64-Bits in einer 64-Bit-Umgebung sein.

Wenn auf 64-Bit-Konvertierung können Sie einfach alle zu NSInteger Ihre int s und long s ersetzen und Sie sollte gut zu gehen.

Wichtig: achten Sie auf die Ausrichtung von Daten, LP64 verwendet natürliche Ausrichtung für alle Integer-Datentypen aber ILP32 verwendet 4 Bytes für alle Integer-Datentypen mit einer Größe gleich oder größer als 4 Byte.

Sie können mehr über 32 bis 64-Bit-Konvertierung im Official 64-Bit Transition Guide for Cocoa Touch lesen.

Beantworten Sie Fragen:

Wie soll ich eine lange in Objective-C erklären? Ist NSInteger geeignet?

können Sie verwenden entweder long oder NSInteger aber NSInteger mehr idiomatische IMHO ist.

Aber sollte ich expliziter sein und etwas wie int64_t oder long direkt verwenden?

Wenn Sie konsistente 64-Bit-Größen weder long noch NSInteger tun erwarten, müssen Sie int64_t verwenden (wie Wevah sagte).

Was wäre der Nachteil gerade lang mit?

Es ist nicht idiomatisch und Sie haben möglicherweise Probleme, wenn Apple wieder eine neue Architektur einrichtet.

Verwandte Themen