/ / Perché l'aritmetica semplice non funziona senza casting? - c #, casting

Perché il semplice lavoro aritmetico non funziona senza il casting? - c #, casting

Ho appena scoperto che questo:

ushort i = 4;
i = i + 4;

dà un errore del compilatore:

Impossibile convertire in modo implicito il tipo "int" in "ushort". Esiste una conversione esplicita (ti manca un cast?)

Devo risolverlo così:

ushort i = 4;
i = (ushort)(i + 4);

Qual è la ragione dietro questo? Non dovrebbe essere ovvio e facile usare tutti i tipi di dati?

risposte:

3 per risposta № 1

Il motivo è perché un ushort + ushort in realtà restituisce un int. Check-out questo thread per maggiori dettagli sul perché questo è il caso.


6 per risposta № 2

Il letterale 4 è un int, così i + 4 è int Inoltre, con i essere promosso a un int. Il risultato di questa aggiunta è anche int, quindi non puoi assegnarlo a ushort senza il cast, poiché C # non consente conversioni implicite a tipi numerici di grandezza minore.


0 per risposta № 3

è perché il compilatore tratta 4 come integer. La conversione dal tipo di dati superiore a quello inferiore richiede il cast esplicito.


0 per risposta № 4

Secondo lo standard di linguaggio C #, in particolare §2.4.4.2 su valori letterali interi:

Il tipo di un intero letterale è determinato come segue:

Se il valore letterale non ha suffisso, ha il primo diquesti tipi in cui può essere rappresentato il suo valore: int, uint, long, ulong. Se il letterale è suffisso da U o u, ha il primo di questi tipi in cui può essere rappresentato il suo valore: uint, ulong. Se il letterale è suffisso da L o l, ha il primo di questi tipi in cui può essere rappresentato il suo valore: lungo, ulong. Se il valore letterale è suffisso da UL, Ul, uL, ul, LU, Lu, lU o lu, è di tipo ulong.

Quindi il tuo numero viene trattato come un int, ecco perché.


0 per risposta № 5

Penso che la cosa principale da togliere ali commenti sono che int32 era solo il tipo "predefinito" per essere utilizzato dall'architettura comune nel corso della giornata. Non conosco il supporto nativo per i tipi interi più piccoli da parte degli attuali processori, ma non sarei sorpreso se tutto fosse ancora convertito in int32 dal compilatore sott'acqua anche se si tratta di un ushort.

Quindi (u) short è più simile a un vincolo di validazioneper il programmatore di un risparmiatore di memoria. Anche se è un risparmiatore di memoria, non sarei sorpreso se sono necessari più cicli della CPU per riconvertire e usort.


0 per risposta № 6

Il +-operatior per i tipi interi è definito solo tra coppie di int, uint, long, e ulong. Calcolare i+4 primo i deve essere convertito da ushort attraverso una conversione numerica implicita in inte anche il risultato è dello stesso tipo int Quindi il tipo di i+4 è effettivamente int. Poiché non esiste una conversione implicita che consenta di assegnare un int a una variabile definita come ushort il compilatore ti dà un errore per i = i + 4.

Si noti che è ancora possibile utilizzare quanto segue perché += coinvolge un cast implicito:

i += 4;