Qual è la differenza tra int
, System.Int16
, System.Int32
e System.Int64
diverso da loro dimensioni?
Qual è la differenza tra int
, System.Int16
, System.Int32
e System.Int64
diverso da loro dimensioni?
Risposte:
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 :
int
eInt32
sono davvero sinonimi;int
sarà un po 'più familiare,Int32
renderà 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',Int32
dove la dimensione è importante (codice crittografico, strutture) in modo che i futuri manutentori sapranno che è sicuro ingrandire unint
se appropriato, ma dovrei occuparmi di cambiare leInt32
variabili allo stesso modo .Il codice risultante sarà identico: la differenza è puramente di leggibilità o aspetto del codice.
int
è sempre Int32
, indipendentemente dal sistema. Forse stai pensando al C ++?
L'unica vera differenza qui è la dimensione. Tutti i tipi int qui sono valori interi con segno che hanno dimensioni variabili
Int16
: 2 byteInt32
e int
: 4 byteInt64
: 8 byteC'è una piccola differenza tra Int64
e il resto. Su una piattaforma a 32 bit, le assegnazioni a una Int64
posizione di archiviazione non sono garantite come atomiche. È garantito per tutti gli altri tipi.
Int64
in 32 bit Windows Operating System
allora quali sono i problemi che potrei affrontare? C'è qualche esempio?
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.
Int64
tipo di dati può essere rappresentato usando L
o il l
suffisso mentre Int16
o Int32
non ha il suffisso in C #.
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à.
Niente. L'unica differenza tra i tipi è la loro dimensione (e, quindi, l'intervallo di valori che possono rappresentare).
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!
short
per adattarli all'array, mentre il secondo letterale 1 viene lasciato come un normale int
. (int)1
non è considerato uguale a (short)1
, (short)2
, (short)3
, quindi il risultato è -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)
tutto funziona come previsto.
Object[],Object
sovraccarico. C # sta implicitamente alzando il valore int
a long
quando necessario (e aumenta anche un valore short
a a int
o long
), ma non verrà implicitamente abbattuto, usando object
invece il sovraccarico. Con Option Strict On
o Off
VB utilizzerà il sovraccarico tipizzato solo se forniti i tipi uniformi, altrimenti utilizza il object
sovraccarico.
for Array.IndexOf comparisons, only trust Int32!
è sbagliata Se si esegue il cast 1
dell'argomento finale sul tipo di array corrispondente, funziona come previsto.
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.
int
e int32
sono la stessa cosa (numero intero a 32 bit)int16
è int breve (2 byte o 16 bit)int64
è il tipo di dati lungo (8 byte o 64 bit)int
è un alias per Int32
e quindi è sempre garantito che sia a 32 bit.
Entrambi sono davvero sinonimi, tuttavia ho trovato la piccola differenza tra loro,
1) Non è possibile utilizzare Int32
durante 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.System
otterrai un errore di compilazione ma non nel casoint
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 Int
simile a Int16, Int32 e Int64. Tutte le utili funzioni come TryParse
per intero vengono Int32.TryParse
.
int16
per salvare la risorsa di memoria, invece di usare semplicementeint
?