Quelle est la différence entre int
, System.Int16
, System.Int32
et d' System.Int64
autres que leurs tailles?
Quelle est la différence entre int
, System.Int16
, System.Int32
et d' System.Int64
autres que leurs tailles?
Réponses:
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 l'a déclaré James Sutherland dans sa réponse :
int
etInt32
sont en effet synonymes;int
sera un peu plus familier,Int32
rend les 32 bits plus explicites pour ceux qui lisent votre code. Je serais enclin à utiliser int où j'ai juste besoin d'un `` entier '',Int32
où la taille est importante (code cryptographique, structures) afin que les futurs responsables sachent qu'il est sûr d'agrandir unint
si approprié, mais devrait prendre soin de changerInt32
variables de la même manière .Le code résultant sera identique: la différence est purement liée à la lisibilité ou à l'apparence du code.
int
c'est toujours Int32
, quel que soit le système. Vous pensez peut-être au C ++?
La seule vraie différence ici est la taille. Tous les types int ici sont des valeurs entières signées qui ont des tailles variables
Int16
: 2 octetsInt32
et int
: 4 octetsInt64
: 8 octetsIl y a une petite différence entre Int64
et le reste. Sur une plate-forme 32 bits, les affectations à un Int64
emplacement de stockage ne sont pas garanties atomiques. Il est garanti pour tous les autres types.
Int64
dans 32 bit Windows Operating System
quels sont alors les questions que je pourrais faire face? Y a-t-il un exemple?
int
Il s'agit d'un type de données primitif défini en C #.
Il est mappé sur Int32 de type FCL.
Il s'agit d'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
Il s'agit d'un type FCL.
En C #, short 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 maximale de +32767.
Int32
Il s'agit d'un type FCL.
En C #, int est mappé sur Int32.
Il s'agit d'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
Il s'agit d'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.
Int64
type de données peut être représenté à l' aide L
ou le l
suffixe tout Int16
ou Int32
pas suffixe en C #.
Selon Jeffrey Richter (l'un des contributeurs du développement du framework .NET) 'CLR via C #':
int est un type primitif autorisé par le compilateur C #, tandis que Int32 est le type de bibliothèque de classes Framework (disponible dans tous les langages qui respectent CLS). En fait, int se traduit par Int32 lors de la compilation.
Aussi,
En C #, les mappages longs vers System.Int64, mais dans un langage de programmation différent, long peuvent mapper vers Int16 ou Int32. En fait, C ++ / CLI traite aussi longtemps que Int32.
En fait, la plupart des langages (.NET) ne traiteront même pas longtemps comme un mot-clé et ne compileront pas le code qui l'utilise.
J'ai vu cet auteur, et de nombreux ouvrages standard sur .NET préférant les types FCL (c.-à-d., Int32) aux types primitifs spécifiques au langage (c.-à-d., Int), principalement sur ces problèmes d'interopérabilité.
Rien. La seule différence entre les types est leur taille (et, par conséquent, la plage de valeurs qu'ils peuvent représenter).
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é obtenir zéro (0) parce que vous demandez ... est 1 dans le tableau de 1, 2 ou 3. si vous obtenez -1 comme réponse, cela signifie que 1 n'est pas dans le tableau de 1, 2 ou 3 .
Eh bien, vérifiez ce que j'ai trouvé: tout ce qui suit devrait vous donner 0 et non -1 (j'ai testé cela dans toutes les versions de framework 2.0, 3.0, 3.5, 4.0)
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)
Donc, mon point est, pour les comparaisons Array.IndexOf, faites uniquement confiance à Int32!
short
pour les adapter au tableau, tandis que le deuxième littéral 1 est laissé comme un ordinaire int
. (int)1
n'est pas considéré comme égal à (short)1
, (short)2
, (short)3
, donc le résultat est -1.
Array.IndexOf(new Int16(){1,2,3}, 1S)
Array.IndexOf(new Int32(){1,2,3}, 1I)
Array.IndexOf(new Int64(){1,2,3}, 1L)
tout fonctionne comme prévu.
Object[],Object
surcharge. C # élève implicitement le int
à un long
lorsque cela est nécessaire (et lève également le a short
à un int
ou long
), mais ne sera pas implicitement abaissé, en utilisant la object
surcharge à la place. Avec Option Strict On
ou Off
VB n'utilisera la surcharge typée que si les types uniformes sont fournis, sinon il utilise la object
surcharge.
for Array.IndexOf comparisons, only trust Int32!
est fausse. Si vous convertissez l' 1
argument final en type de tableau correspondant, il fonctionne comme prévu.
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 y a une réponse plus spécifique à C #, veuillez voter pour cela à la place!
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 définit uniquement un int comme plus grand ou égal à un court, bien qu'en pratique c'est la largeur du processeur que vous ciblez, qui est probablement 32 bits mais vous devez savoir que ce pourrait ne pas être.
int
et int32
sont une seule et même chose (entier 32 bits)int16
est un entier court (2 octets ou 16 bits)int64
est le type de données long (8 octets ou 64 bits)int
est un alias pour Int32
et est donc toujours garanti à 32 bits.
Ils sont tous les deux synonymes, mais 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
relève de la déclaration système. si vous supprimez, using.System
vous obtiendrez une erreur de compilation, mais pas au cas oùint
Int = Int32 -> Type long d'origine
Int16 -> Original int
Int64 -> Un nouveau type de données devient disponible après les systèmes 64 bits
"int" n'est disponible que pour la compatibilité descendante. Nous devrions vraiment utiliser de nouveaux types int pour rendre nos programmes plus précis.
---------------
Une autre chose que j'ai remarquée en cours de route est qu'il n'y a pas de classe nommée Int
similaire à Int16, Int32 et Int64. Toutes les fonctions utiles comme TryParse
pour entier proviennent de Int32.TryParse
.
int16
pour économiser les ressources mémoire, plutôt que de simplement utiliserint
?