web-dev-qa-db-fra.com

Quelle est la différence entre int, Int16, Int32 et Int64?

Quelle est la différence entre int, System.Int16, System.Int32 et System.Int64 autre que leur taille?

202
Joby Kurian

Chaque type d'entier a une plage de capacité de stockage différente

   Type      Capacity

   Int16 -- (-32,768 to +32,767)

   Int32 -- (-2,147,483,648 to +2,147,483,647)

   Int64 -- (-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807)

Comme indiqué par James Sutherland dans sa réponse :

int et Int32 sont en effet synonymes; int sera un peu plus familier, Int32 rend le bit 32 bits plus explicite pour ceux qui lisent votre code. Je serais enclin à utiliser int où j'ai juste besoin de 'un entier', Int32 où la taille est importante (code cryptographique, structures) afin que les futurs responsables sachent qu'il est prudent d'agrandir int si nécessaire, mais il faut prendre soin de changer les variables Int32 de la même manière.

Le code résultant sera identique: la différence est purement de lisibilité ou d’apparence de code.

305
user1082916

La seule différence réelle ici est la taille. Tous les types int ici sont des valeurs entières signées qui ont des tailles variables

  • Int16: 2 octets
  • Int32 et int: 4 octets
  • Int64: 8 octets

Il y a une petite différence entre Int64 et les autres. Sur une plate-forme 32 bits, les attributions à un emplacement de stockage Int64 ne sont pas forcément atomiques. Il est garanti pour tous les autres types.

111
JaredPar

int

C'est un type de données primitif défini en C #.

Il est mappé sur Int32 de type FCL.

C'est un type de valeur et représente la structure System.Int32.

Il est signé et prend 32 bits.

Il a une valeur minimale de -2147483648 et maximale de +2147483647.

Int16

C'est un type FCL.

En C #, court est mappé sur Int16.

Il s'agit d'un type de valeur et représente la structure System.Int16.

Il est signé et prend 16 bits.

Il a une valeur minimale de -32768 et une valeur maximale de 32767.

Int32

C'est un type FCL.

En C #, int est mappé sur Int32.

C'est un type de valeur et représente la structure System.Int32.

Il est signé et prend 32 bits.

Il a une valeur minimale de -2147483648 et maximale de +2147483647.

Int64

C'est un type FCL.

En C #, long est mappé sur Int64.

Il s'agit d'un type de valeur et représente la structure System.Int64.

Il est signé et prend 64 bits.

Il a une valeur minimale de -9,223,372,036,854,775,808 et maximale de 9 223 372 036 854 775 807.

67
Haris

Selon Jeffrey Richter (un des contributeurs du livre 'CLR via C #' du développement du .NET Framework):

int est un type primitif autorisé par le compilateur C #, alors que Int32 est le type de bibliothèque de classes Framework (disponible dans les langues respectant CLS). En fait, int se traduit en Int32 lors de la compilation.

Aussi,

En C #, long est mappé sur System.Int64, mais dans un langage de programmation différent, long peut mapper sur Int16 ou Int32. En fait, C++/CLI traite longtemps comme Int32.

En fait, la plupart des langages (.NET) ne traitent même pas le long mot-clé et ne compilent pas le code qui l'utilise.

J'ai vu cet auteur et de nombreux ouvrages classiques sur .NET préférant les types FCL (c'est-à-dire Int32) aux types primitifs spécifiques à une langue (c'est-à-dire int), principalement sur de tels problèmes d'interopérabilité.

14
Praveen

Rien. La seule différence entre les types est leur taille (et donc la plage de valeurs qu’ils peuvent représenter).

8
duskwuff

Une note très importante sur les types 16, 32 et 64:

si vous exécutez cette requête ... Array.IndexOf (new Int16 [] {1,2,3}, 1)

vous êtes supposé avoir zéro (0) parce que vous demandez ... vaut 1 dans le tableau de 1, 2 ou 3. Si vous obtenez -1 comme réponse, cela signifie que 1 ne fait pas partie du tableau de 1, 2 ou 3 .

Regardez ce que j’ai trouvé: Tout ce qui suit devrait vous donner 0 et pas -1 (j’ai testé cela dans toutes les versions 2.0, 3.0, 3.5, 4.0 du framework)

C #:

Array.IndexOf(new Int16[]{1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32[]{1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64[]{1,2,3}, 1) = 0 (correct)

VB.NET:

Array.IndexOf(new Int16(){1,2,3}, 1) = -1 (not correct)
Array.IndexOf(new Int32(){1,2,3}, 1) = 0 (correct)
Array.IndexOf(new Int64(){1,2,3}, 1) = -1 (not correct)

Mon point est donc, pour les comparaisons Array.IndexOf, ne faites confiance qu’à Int32!

8
tno2007

EDIT: Ce n'est pas tout à fait vrai pour C #, une balise que j'ai manquée lorsque j'ai répondu à cette question - s'il existe une réponse plus spécifique à C #, votez plutôt pour cela!


Ils représentent tous des nombres entiers de tailles variables.

Cependant, il y a une très très petite différence.

int16, int32 et int64 ont tous une taille fixe.

La taille d'un int dépend de l'architecture pour laquelle vous compilez - la spécification C ne définit un int que plus grand ou égal à un court bien qu'en pratique c'est la largeur du processeur que vous ciblez, ce qui est probablement 32bit mais vous devez savoir que ce n'est peut-être pas le cas.

7
deanWombourne
  1. int et int32 sont identiques (entier 32 bits)
  2. int16 est court int (2 octets ou 16 bits)
  3. int64 est le type de données long (8 octets ou 64 bits)
6
Sunil Kumar B M

Ils sont tous les deux synonymes, cependant j'ai trouvé la petite différence entre eux,

1) Vous ne pouvez pas utiliser Int32 lors de la créationenum

enum Test : Int32
{ XXX = 1   // gives you compilation error
}

enum Test : int
{ XXX = 1   // Works fine
}

2) Int32 se trouve sous Déclaration système. si vous supprimez using.System, vous obtiendrez une erreur de compilation, mais pas dans le cas où int

4
this.girish