7
votes

Comment devrais-je déclarer une longue dans l'objectif-c? Nsinteger est-il approprié?

Je vois nsinteger est utilisé assez souvent et le Typedef 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 ou directement directement? Quel serait l'inconvénient d'utiliser juste longtemps?


0 commentaires

5 Réponses :


19
votes

IIRC, long 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 .


7 commentaires

Ouais, Nsinteger sera le type de mot natif.


Sur x86 long 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 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.)



0
votes

Si vous avez besoin d'un type de taille spécifique connue, utilisez le type qui a cette taille spécifique connue: intz3_t .

Si vous avez besoin d'un type d'entier générique et que la taille n'est pas importante, allez-y et utilisez int ou nsinteger . .


0 commentaires

0
votes

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.

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.

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 . Si je me soucie de la largeur, j'utilise les types C intégrés


0 commentaires

0
votes

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.

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.

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.


0 commentaires

2
votes

Types de données Entier Tailles
  • court - ILP32 : 2 octets; LP64 : 2 octets

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

  • long - ILP32 : 4 octets; LP64 : 8 octets

  • long long - ILP32 : 8 octets; LP64 : 8 octets

    Il peut être utile de savoir que:

    Le compilateur définit le __ __ LP64 macro lors de la compilation pour l'environnement d'exécution 64 bits.

    NSInteger est un typedef de longue il sera donc de 32 bits à un environnement 32 bits et 64 bits dans un 64 environnement -bit.

    Lors de la conversion à 64 bits, vous pouvez simplement remplacer tous vos int et long s NSInteger et vous devrait < / em> être bon d'aller.

    Important: attention à l'alignement des données, LP64 utilise un alignement naturel pour tous les types de données entiers, mais ILP32 utilise 4 octets pour tous les types de données entiers de taille égale ou supérieure à 4 octets.

    Vous pouvez en savoir plus sur 32 à 64 bits conversion au Journal officiel 64 bits Guide de transition pour Cocoa touch .

    Répondre aux questions:

    Comment dois-je déclarer un long en Objective-C? NSInteger est-il approprié?

    Vous pouvez utiliser long ou NSInteger mais NSInteger est plus idiomatiques à mon humble avis.

    Mais dois-je être quelque chose de plus explicite et l'utilisation comme int64_t ou à long directement?

    Si vous attendez la taille 64 bits compatible ni long ni NSInteger faire, vous devrez utiliser int64_t (comme Wevah dit).

    Quel serait l'inconvénient d'utiliser simplement de temps?

    Il est pas idiomatiques et vous pouvez avoir des problèmes si les rouleaux d'Apple sur une nouvelle architecture à nouveau.


0 commentaires