Est-ce qu'un int est un entier 64 bits en C#64 bits?

dans mon code C # source j'ai pu déclarer des entiers comme:

int i = 5;

ou

Int32 i = 5;

dans le monde 32 bits courant, ils sont équivalents. Cependant, alors que nous entrons dans un monde à 64 bits, ai-je raison de dire que les suivants deviendront les mêmes?

int i = 5;
Int64 i = 5;
27
demandé sur Peter Mortensen 2008-10-03 01:13:47

10 réponses

Pas de. La spécification C # définit rigidement que int est un alias pour System.Int32 avec exactement 32 bits. Changer ceci serait un majeur changement de rupture.

45
répondu Jon Skeet 2008-10-02 21:15:18

le mot-clé int dans C# est défini comme un alias pour le type System.Int32 et c'est (à en juger par le nom) censé être un entier 32 bits. À la spécification:

spécification CLI la section 8.2.2 (valeur intégrée et types de référence) comporte un tableau avec ce qui suit:

  • System.Int32 - entier Signé de 32 bits

C# spécification la section 8.2.1 (types prédéfinis) comporte un tableau similaire:

  • int - 32-bit signé partie intégrante de type

cela garantit que System.Int32 dans CLR et int dans C# seront toujours 32 bits.

43
répondu Tomas Petricek 2010-07-14 18:51:30

Sera sizeof(testInt) jamais être 8?

Non, sizeof(testInt) est une erreur. testInt est une variable locale. La taille de l'opérateur nécessite un type comme argument. Ce ne sera jamais 8 car il sera toujours une erreur.

VS2010 compile un entier C # managé comme 4 octets, même sur une machine 64 bits.

Correct. Je note que la section 18.5.8 de la spécification C# définit sizeof(int) comme étant la constante de temps de compilation 4. C'est quand vous dites sizeof(int) , le compilateur remplace simplement qu'avec 4; c'est comme si tu avais dit "4" dans le code source.

est-ce que quelqu'un sait si/quand viendra le temps qu'un" int " standard en C# soit 64 bits?

jamais. La section 4.1.4 de la spécification C# indique que " int "est synonyme de "System".Int32".

si quoi vous voulez est un "pointer-sized entier" puis utiliser IntPtr. Un IntPtr change de taille sur différentes architectures.

17
répondu Eric Lippert 2010-07-14 20:50:54

int est toujours synonyme de Int32 sur toutes les plateformes.

il est très peu probable que Microsoft va changer cela dans le futur, car il briserait beaucoup de code existant qui suppose int est de 32 bits.

11
répondu BlueRaja - Danny Pflughoeft 2015-04-17 02:07:03

je pense que ce que vous pouvez confondre est que int est un alias pour Int32 donc il sera toujours 4 octets, mais IntPtr est supposé correspondre à la taille mot de l'architecture CPU donc il sera de 4 octets sur un système de 32 bits et 8 octets sur un système de 64 bits.

5
répondu Brian Gideon 2010-07-14 19:00:30

selon la spécification C# ECMA-334 , section" 11.1.4 types simples", le mot réservé int sera alias System.Int32 . Comme il s'agit d'une spécification, il est très peu probable qu'elle change.

4
répondu Jess 2010-07-14 18:48:39

peu importe que vous utilisiez la version 32 bits ou la version 64 bits du CLR, dans C# an int signifiera toujours System.Int32 et long signifiera toujours System.Int64 .

3
répondu Mark Cidade 2008-10-02 21:28:38

, La suite toujours vrai en C#:

sbyte signé 8 bits 1 octet

octet non signé 8 bits 1 octet

court signé de 16 bits, 2 octets

ushort non signé de 16 bits, 2 octets

int signé 32 bits, 4 bytes

uint non signé de 32 bits, 4 octets

long signé de 64 bits, 8 octets

ulong non signé de 64 bits, 8 octets

entier littérale est juste une suite de chiffres (par exemple, 314159 ) sans l'un de ces types explicites. C # lui assigne le premier type dans la séquence ( int , uint , long , ulong ) dans lequel il s'inscrit. Cela semble avoir été un peu confus dans au moins une des réponses ci-dessus.

bizarrement le unary minus operator (signe moins) apparaissant avant une chaîne de chiffres ne pas réduire le choix à ( int , long ). La traduction littérale est toujours positif; le signe moins est vraiment un opérateur. Donc probablement -314159 est exactement la même chose que -((int)314159) . Sauf qu'apparemment il y a un cas spécial pour obtenir -2147483648 directement dans un int ; autrement il serait -((uint)2147483648) . J'imagine qu'a fait quelque chose de désagréable.

D'une façon ou d'une autre, il semble sûr de prédire que C# (et ses amis) ne s'embêtera jamais avec les types "nom squishy" pour >=128 bits entiers. Nous obtiendrons un bon support pour arbitrairement grands entiers et un support super-précis pour UInt128, UInt256, etc. dès que les processeurs de soutien de maths que large, et presque jamais utiliser. Les espaces d'adresses 64 bits sont vraiment grand. S'ils sont trop petits, ce sera pour une raison ésotérique comme ASLR ou un MapReduce plus efficace ou quelque chose comme ça.

1
répondu PreventRage 2016-07-04 05:03:05

Oui, comme Jon l'a dit, et contrairement au 'C/C++ world', Java et C# ne dépendent pas du système sur lequel ils tournent. Ils ont des longueurs strictement définies pour les flotteurs de précision byte/short/int/long et single/double, égales sur tous les systèmes.

0
répondu zappan 2015-06-27 18:45:20

int sans suffixe peut être soit 32bit ou 64bit, cela dépend de la valeur qu'il représente.

comme défini dans MSDN:

Lorsqu'un entier littéral n'a pas de suffixe, son type est le premier de ces types dans lequel sa valeur peut être représentée: int, uint, long, ulong.

Voici l'adresse: https://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx

0
répondu House.Lee 2015-08-20 23:31:12