Je vois nsinteger code> est utilisé assez souvent et le Typedef code> pour celui-ci est un long, donc techniquement je pourrais l'utiliser quand je m'attends à (64) valeurs. Mais devrais-je être plus explicite et utiliser quelque chose comme intz_t code> ou directement directement? Quel serait l'inconvénient d'utiliser juste longtemps? P>
5 Réponses :
IIRC, long code> sur l'iPhone / Bras est de 32 bits. Si vous souhaitez un entier garanti de 64 bits garanti, vous devez utiliser (en effet) utiliser intz_t code>. P>
Ouais, Nsinteger sera le type de mot natif.
Sur x86 long code> est également 32 bits.
@KennyTM: Cela dépend du système d'exploitation et compilateurs, pas seulement du matériel.
@Stephan: vrai. Mais dans ce contexte, le compilateur doit être GCC ou SLIG, et le système d'exploitation doit être Mac OS X.
@KennyTM: Et si l'exécutable est construit 64 bits sur OS X / x86, long code> est de 64 bits de large.
Mais ce n'est pas, puisque l'OP demande à l'iPhone. /hausser les épaules
(NB: 4 ans plus tard, nous avons maintenant des appareils iOS 64 bits.)
Si vous avez besoin d'un type de taille spécifique connue, utilisez le type qui a cette taille spécifique connue: Si vous avez besoin d'un type d'entier générique et que la taille n'est pas importante, allez-y et utilisez intz3_t code>. P>
int code> ou nsinteger code>. p>.
La longueur de NSInteger dépend de la compilation de 32 bits ou de 64 bits. Il est défini comme long pour 64 bits et iPhone et INT pour 32 bits. p>
Ainsi, sur iPhone, la longueur de NsInteger est la même que la longueur d'un long, qui dépend du compilateur. La plupart des compilateurs donnent longtemps la même longueur que le mot natif. I.e. 32 bits pour les architectures 32 bits et 64 bits pour les architectures 64 bits. P>
Compte tenu de l'incertitude sur la largeur de Nsinteger, je ne l'utilise que pour les types de variables à utiliser dans l'API de cacao lorsque Nsinteger est spécifié. Si j'ai besoin d'un type de largeur fixe, je vais pour ceux définis dans stdint.h code>. Si je me soucie de la largeur, j'utilise les types C intégrés p>
Si vous voulez déclarer quelque chose aussi longtemps, déclarez-le aussi longtemps. Sachez que longtemps peut être 32 ou 64 bits, selon le compilateur. p>
Si vous voulez déclarer quelque chose d'être aussi efficace que possible, et assez grand pour compter les articles, utilisez Nsinteger ou Nsuinteger. Notez que les deux peuvent être 32 ou 64 bits, et peuvent être en réalité différents types (int ou long), en fonction du compilateur. Qui vous protège des types de mélange dans certains cas. p>
Si vous voulez 32 ou 64 bits, et rien d'autre, utilisez int32_t, uint32_t, intz_t, uint64_t. Sachez que l'un ou l'autre type peut être inutilement inefficace sur certains compilateurs. p>
Il peut être utile de savoir que: p>
Le compilateur définit le Lors de la conversion à 64 bits, vous pouvez simplement remplacer tous vos Important: strong> attention à l'alignement des données, LP64 em> utilise un alignement naturel pour tous les types de données entiers, mais ILP32 em> utilise 4 octets pour tous les types de données entiers de taille égale ou supérieure à 4 octets. p>
Vous pouvez en savoir plus sur 32 à 64 bits conversion au Journal officiel 64 bits Guide de transition pour Cocoa touch strong> . p>
Répondre aux questions: p>
Comment dois-je déclarer un long en Objective-C? NSInteger est-il approprié? P>
blockQuote>
Vous pouvez utiliser Mais dois-je être quelque chose de plus explicite et l'utilisation comme int64_t ou à long directement? P>
blockQuote>
Si vous attendez la taille 64 bits compatible ni Quel serait l'inconvénient d'utiliser simplement de temps? P>
blockQuote>
Il est pas idiomatiques et vous pouvez avoir des problèmes si les rouleaux d'Apple sur une nouvelle architecture à nouveau. P> court code> - ILP32 em>: 2 octets; LP64 em>: 2 octets p>
li>
int code> - ILP32 em>: 4 octets; LP64 em>: 4 octets p>
li>
long code> - ILP32 em>: 4 octets; LP64 em>: 8 octets p>
li>
long long code> - ILP32 em>: 8 octets; LP64 em>: 8 octets p>
li>
ul>
__ __ LP64 code> macro lors de la compilation pour l'environnement d'exécution 64 bits. P>
blockQuote>
NSInteger code> est un typedef code> de longue code> il sera donc de 32 bits à un environnement 32 bits et 64 bits dans un 64 environnement -bit. p>
int code> et long code> s NSInteger code> et vous devrait < / em> être bon d'aller. p>
long code> ou NSInteger code> mais NSInteger code> est plus idiomatiques à mon humble avis. P>
long code> ni NSInteger code> faire, vous devrez utiliser int64_t code> (comme Wevah dit). p>