Qual è la differenza tra int, Int16, Int32 e Int64?


229

Qual è la differenza tra int, System.Int16, System.Int32e System.Int64diverso da loro dimensioni?

Risposte:


348

Ogni tipo di numero intero ha un intervallo diverso di capacità di archiviazione

   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)

Come affermato da James Sutherland nella sua risposta :

inte Int32sono davvero sinonimi; intsarà un po 'più familiare, Int32renderà il 32-testimone più esplicito per coloro che leggono il tuo codice. Sarei propenso a usare int dove ho solo bisogno di 'un numero intero', Int32dove la dimensione è importante (codice crittografico, strutture) in modo che i futuri manutentori sapranno che è sicuro ingrandire un intse appropriato, ma dovrei occuparmi di cambiare le Int32variabili allo stesso modo .

Il codice risultante sarà identico: la differenza è puramente di leggibilità o aspetto del codice.


1
Se sai che il valore non supererà 65.535 (con segno) o da -32.768 a 32.767 (senza segno) non sarebbe meglio definire il numero intero int16per salvare la risorsa di memoria, invece di usare semplicemente int?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8
int e int32 possono essere sinonimi, ma non è necessario. Al giorno d'oggi, la maggior parte dei sistemi venduti sono a 64 bit, nel qual caso un int sarà di 64 bit.
Martijn Otto,

4
Per Matthew T. Baker e tutti gli altri come me che sono venuti qui cercando di decidere quale utilizzare dal punto di vista delle prestazioni, dovresti dare un'occhiata a questo post che suggerisce che Integer è più efficiente di Int16 in molti casi: stackoverflow.com/questions/129023/ net-integer-vs-int16
Tony L.

19
@MartijnOtto La domanda è taggata C #. In C #, intè sempre Int32 , indipendentemente dal sistema. Forse stai pensando al C ++?

9
@MattBaker: In generale, sui computer moderni, un int16 occupa lo stesso spazio di un int32 (e in realtà un int64) perché, affinché la maggior parte delle operazioni sia efficiente, eseguiamo il pad intorno ai dati per rendere gli accessi allineati ai limiti di 32 o 64 bit (rispettivamente in modalità 32 o 64 bit). Questo perché gli accessi non allineati sono ridicolmente inefficienti su alcune architetture e non possibili su altre.
Gioele il

118

L'unica vera differenza qui è la dimensione. Tutti i tipi int qui sono valori interi con segno che hanno dimensioni variabili

  • Int16: 2 byte
  • Int32e int: 4 byte
  • Int64 : 8 byte

C'è una piccola differenza tra Int64e il resto. Su una piattaforma a 32 bit, le assegnazioni a una Int64posizione di archiviazione non sono garantite come atomiche. È garantito per tutti gli altri tipi.


Se uso Int64in 32 bit Windows Operating Systemallora quali sono i problemi che potrei affrontare? C'è qualche esempio?
Shaijut,

70

int

È un tipo di dati primitivo definito in C #.

È mappato su Int32 di tipo FCL.

È un tipo di valore e rappresenta la struttura System.Int32.

È firmato e richiede 32 bit.

Ha un valore minimo di -2147483648 e massimo +2147483647.

Int16

È un tipo FCL.

In C #, short è mappato su Int16.

È un tipo di valore e rappresenta la struttura System.Int16.

È firmato e richiede 16 bit.

Ha un valore minimo di -32768 e massimo di +32767.

Int32

È un tipo FCL.

In C #, int è mappato su Int32.

È un tipo di valore e rappresenta la struttura System.Int32.

È firmato e richiede 32 bit.

Ha un valore minimo di -2147483648 e massimo +2147483647.

Int64

È un tipo FCL.

In C #, long è mappato su Int64.

È un tipo di valore e rappresenta la struttura System.Int64.

È firmato e richiede 64 bit.

Ha un valore minimo di -9.223.372.036.854.775.808 e un valore massimo di 9.223.372.036.854.775.807.


Solo per aggiungere quel Int64tipo di dati può essere rappresentato usando Lo il lsuffisso mentre Int16o Int32non ha il suffisso in C #.
RBT,

14

Secondo il libro "CLR via C #" di Jeffrey Richter (uno dei collaboratori dello sviluppo di framework .NET):

int è un tipo primitivo consentito dal compilatore C #, mentre Int32 è il tipo di libreria di classi Framework (disponibile in tutte le lingue che rispettano CLS). In effetti, int si traduce in Int32 durante la compilazione.

Anche,

In C #, long esegue il mapping a System.Int64, ma in un linguaggio di programmazione diverso, long può eseguire il mapping a Int16 o Int32. In effetti, C ++ / CLI tratta come Int32.

In effetti, la maggior parte delle lingue (.NET) non tratterà nemmeno a lungo come una parola chiave e non compilerà il codice che la utilizza.

Ho visto questo autore e molte pubblicazioni standard su .NET che preferiscono i tipi FCL (cioè Int32) ai tipi primitivi specifici del linguaggio (cioè int), principalmente su tali problemi di interoperabilità.


8

Niente. L'unica differenza tra i tipi è la loro dimensione (e, quindi, l'intervallo di valori che possono rappresentare).


8

Una nota molto importante sui tipi 16, 32 e 64:

se si esegue questa query ... Array.IndexOf (new Int16 [] {1,2,3}, 1)

supponiamo di ottenere zero (0) perché stai chiedendo ... è 1 nella matrice di 1, 2 o 3. se ottieni -1 come risposta, significa che 1 non è nella matrice di 1, 2 o 3 .

Bene, dai un'occhiata a quello che ho trovato: tutto ciò che segue dovrebbe darti 0 e non -1 (l'ho provato in tutte le versioni di 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)

Quindi il mio punto è, per Array.IndexOf dei confronti, fidarsi solo di Int32!


7
Per chiarire perché il primo esempio funziona in questo modo: il primo letterale 1, il 2 e il 3 sono implicitamente espressi shortper adattarli all'array, mentre il secondo letterale 1 viene lasciato come un normale int. (int)1non è considerato uguale a (short)1, (short)2, (short)3, quindi il risultato è -1.

4
Ci sarebbe un aggiustamento simile disponibile per le versioni C #, ma FYI un semplice identificatore di tipo risolve questo problema: Array.IndexOf(new Int16(){1,2,3}, 1S) Array.IndexOf(new Int32(){1,2,3}, 1I) Array.IndexOf(new Int64(){1,2,3}, 1L)tutto funziona come previsto.
Mark Hurd,

1
E quelli che non funzionano hanno usato il Object[],Objectsovraccarico. C # sta implicitamente alzando il valore inta longquando necessario (e aumenta anche un valore shorta a into long), ma non verrà implicitamente abbattuto, usando objectinvece il sovraccarico. Con Option Strict Ono OffVB utilizzerà il sovraccarico tipizzato solo se forniti i tipi uniformi, altrimenti utilizza il objectsovraccarico.
Mark Hurd,

La tua risposta è fuorviante. Il codice sta confrontando valori di diversi tipi. La conclusione for Array.IndexOf comparisons, only trust Int32!è sbagliata Se si esegue il cast 1dell'argomento finale sul tipo di array corrispondente, funziona come previsto.
Don Cheadle,

Questo è un comportamento molto interessante e inaspettato (dal momento che int per lavori lunghi ma breve per int non lo fa) quindi il voto!
sth_Weird,

7

EDIT: Questo non è del tutto vero per C #, un tag che mi mancava quando ho risposto a questa domanda - se c'è una risposta più specifica per C #, vota invece per quello!


Tutti rappresentano numeri interi di varie dimensioni.

Tuttavia, c'è una differenza molto piccola.

int16, int32 e int64 hanno tutti una dimensione fissa .

La dimensione di un int dipende dall'architettura per la quale stai compilando - la specifica C definisce un int solo come più grande o uguale a un corto, anche se in pratica è la larghezza del processore che stai prendendo di mira, che è probabilmente a 32 bit ma dovresti sapere che potrebbe non essere.


1
Questa dovrebbe essere la risposta accettata in quanto questa è l'unica che è effettivamente corretta
mjs

2
No, questo non è vero per C #. AC # int ha sempre una dimensione di 32 bit. Per C, sì, hai dovuto affrontare questa complicazione e spesso vedi macro nel codice C per gestire dimensioni int variabili. Vedi ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf pagina 18.
Ananke,

@Ananke Ahh, mancato il tag C #. Vorrei poter ripristinare alcuni voti sulle risposte .....
mjs,

6
  1. inte int32sono la stessa cosa (numero intero a 32 bit)
  2. int16 è int breve (2 byte o 16 bit)
  3. int64 è il tipo di dati lungo (8 byte o 64 bit)

2
int non è garantito per essere a 32 bit.
mjs

8
@mjs, questo semplicemente non è vero. In C #, intè un alias per Int32e quindi è sempre garantito che sia a 32 bit.
David Arno,

In realtà quello che dice mjs è corretto, INT significa intero basato sul sistema x86 o x64, quindi se il tuo sistema è x64, int sarà Int64, quindi non è garantito che sia 32 .. Se metti int32 in un x64 sarà sempre int32 .
Yogurtu,

5
No, ciò che David Arno dice è corretto. Il linguaggio C # definisce specificamente 'int' per indicare un numero intero a 32 bit (Int32). Altre lingue (C / C ++, ecc.) Potrebbero non specificarlo, ma questa domanda è taggata "C #".
Theo Brinkman,

@TheoBrinkman Corretto, ecco la pagina di Microsoft sui tipi numerici integrali di C #: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Max Barraclough

5

Entrambi sono davvero sinonimi, tuttavia ho trovato la piccola differenza tra loro,

1) Non è possibile utilizzare Int32durante la creazioneenum

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

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

2) Int32 rientra nella dichiarazione di sistema. se rimuovi using.Systemotterrai un errore di compilazione ma non nel casoint


-8

Int = Int32 -> Tipo lungo originale

Int16 -> int originale

Int64 -> Il nuovo tipo di dati diventa disponibile dopo i sistemi a 64 bit

"int" è disponibile solo per compatibilità con le versioni precedenti. Dovremmo davvero utilizzare nuovi tipi int per rendere i nostri programmi più precisi.

---------------

Un'altra cosa che ho notato lungo la strada è che non esiste una classe chiamata Intsimile a Int16, Int32 e Int64. Tutte le utili funzioni come TryParseper intero vengono Int32.TryParse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.