Perché int32.maxvalue + 1 ha un overflow lungo?

Se si inserisce il seguente codice in un’applicazione .NET 4.5:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1; 

Viene generato un errore del compilatore che afferma “L’operazione trabocca al momento della compilazione in modalità controllata”. So che potrei metterlo in un blocco “non controllato” e stare bene, ma la mia domanda è: perché l’errore appare in primo luogo? Chiaramente un lungo può contenere il valore massimo di un int, più uno.

Si noti che l’uso di Int32 e Int64 invece di long e int non sembra essere d’aiuto.

È perché i calcoli sul lato destro del compito vengono eseguiti in un tipo intero. Ed è un numero intero traboccante

Puoi risolvere il problema con:

 public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L 

Lanciare a lungo almeno uno degli operandi

Il motivo per cui ottieni l’errore è specificato nelle specifiche C #.

Vedi C # Specification Section 4.1.5 (Tipi integrali)

Per gli operatori binari +, -, *, /,%, &, ^, |, ==,! =,>, < ,> = E < =, gli operandi vengono convertiti in tipo T, dove T è il primo di int, uint, long e ulong che possono rappresentare pienamente tutti i valori possibili di entrambi gli operandi. L’operazione viene quindi eseguita utilizzando la precisione di tipo T e il tipo del risultato è T (o bool per gli operatori relazionali). Non è consentito che un operando sia di tipo lungo e l’altro sia di tipo più lungo con gli operatori binari.

Nel tuo caso dal momento che entrambi gli operandi di addizione possono essere rappresentati in int quindi il calcolo viene eseguito in tipo intero. Lanciare esplicitamente uno degli operandi su long risulterebbe in long risultato long e quindi nessun errore di overflow.

Il tuo codice infatti si presenta così:

 (long)(int.MaxValue + 1) 

Ma poiché .Net framework ha una conversione implicita incorporata tra int e long non è necessario inserire esplicitamente un cast a lungo nel codice.

Quindi, in primo luogo, questa parte del codice viene eseguita:

 int.MaxValue + 1 

e il risultato di questa operazione è un valore int che causa un’eccezione di overflow. Quindi il tuo codice non ha nemmeno la possibilità di avviare la conversione da int a long.

Penso che questo abbia a che fare con il valore di int.MaxValue + 1 calcolato prima del cast a long . Certamente un lungo può contenere il valore, ma poiché si sta facendo l’aggiunta di interi, non c’è modo di memorizzare il valore intero di int.MaxValue + 1 in un int fino a quando il cast è fatto.

provare

 public const long MAXIMUM_RANGE_MAGNITUDE = (long)int.MaxValue + 1L; 

Trasmetti il ​​valore costante a lungo.

 public const long MAXIMUM_RANGE_MAGNITUDE = (long) int.MaxValue + 1;