L'overflow aritmetico si verifica quando un calcolo, come un'operazione aritmetica o una conversione di tipo, produce un valore maggiore della capacità del tipo che lo riceve.
In queste circostanze, le espressioni di tipo int e long e le loro controparti senza segno si avvolgono silenziosamente.
Il comportamento dei calcoli con numeri interi può essere modificato usando la parola chiave checked. Quando si verifica un overflow all'interno di un blocco checked, viene lanciata un'istanza di OverflowException.
int one = 1;
checked
{
int expr = int.MaxValue + one; // OverflowException is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // OverflowException is thrown
Le espressioni di tipo float e double assumono un valore speciale di infinito.
Le espressioni di tipo decimal lanciano un'istanza di OverflowException.
Il paese di Hyperia ha i suoi problemi. In particolare, l'inflazione è fuori controllo. Ti hanno fatto arrivare qui per assumere un incarico presso la banca centrale.
Per semplificare l'amministrazione interna, la banca centrale ha suddiviso ogni taglio in due parti: una base, che rimane relativamente invariata, e un moltiplicatore (uguale per tutti i tagli) che può essere modificato ogni anno, ogni settimana o persino ogni giorno.
Al momento della stampa, i tagli riportati sulle banconote sono il prodotto di base e moltiplicatore.
Quando questo sistema fu introdotto, la banconota di valore più basso aveva già un taglio di 10.000.000. La tabella sottostante mostra la situazione (per i primi 3 tagli) al momento dell'introduzione del sistema. Le cose sono peggiorate molto da allora: non cambia solo il moltiplicatore, ma anche la base.
| Base | Moltiplicatore | Taglio |
|---|---|---|
| 10.000 | 1.000 | 10.000.000 |
| 50.000 | 1.000 | 50.000.000 |
| 100.000 | 1.000 | 100.000.000 |
| ... | 1.000 | ... |
In sintesi, questo significa che taglio = base * moltiplicatore.
Implementa il metodo CentralBank.DisplayDenomination(): riceve la base e il moltiplicatore e restituisce una stringa con il loro prodotto (base * moltiplicatore). La stringa numerica restituita non deve essere formattata.
Se l'operazione di moltiplicazione provoca un overflow, allora va restituita la stringa "*** Too Big ***".
CentralBank.DisplayDenomination(10000L, 1000L);
// => "10000000"
CentralBank.DisplayDenomination(long.MaxValue / 2, 10000L);
// => "*** Too Big ***"
Per registrare il PIL internamente, la banca centrale usa lo stesso approccio del moltiplicatore. Le statistiche vengono registrate in un taglio base e poi scalate usando il moltiplicatore.
Implementa il metodo CentralBank.DisplayGDP(): riceve il PIL di base e il moltiplicatore corrente e restituisce il PIL come stringa.
Se il PIL non può essere calcolato, viene restituito "*** Too Big ***".
CentralBank.DisplayGDP(555f, 10000f);
// => "5550000"
CentralBank.DisplayGDP(float.MaxValue / 2, 10000f);
// => "*** Too Big ***"
Il tuo capo in banca vuole assicurarsi che non ci siano problemi al momento delle buste paga.
Implementa il metodo CentralBank.DisplayChiefEconomistSalary(), che riceve uno stipendio espresso in unità base (come sopra) e un moltiplicatore e restituisce una stringa contenente il prodotto.
Se lo stipendio non può essere calcolato, viene restituito "*** Much Too Big ***".
CentralBank.DisplayChiefEconomistSalary(555000m, 10000m);
// => "5550000000"
CentralBank.DisplayChiefEconomistSalary(555000m, decimal.MaxValue / 2L);
// => "*** Much Too Big ***"
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.