Utente:LoStrangolatore/Java/Aritmetica dei numeri interi

Argomenti:

  • il principio di base è: per ciascuna operazione, converti gli operandi al tipo più "grande" tra i due e poi esegui l'operazione; per la conversione, basati solo sul compile-time type, e non sul valore numerico a run-time, né sull'uso che viene fatto del risultato dell'operazione. Per es. short i = (short)( Integer.MAX_VALUE + (short)1 ) ===> lo short viene convertito in int e poi viene eseguita la somma tra int; viene considerato il solo compile-time type, e quindi non il fatto che la somma a run-time genera overflow tra int ma non se gli operandi fossero long, né il fatto che il tutto sarà poi convertito verso short e messo in una variabile short.
  • ciascun tipo definisce un valore massimo e uno minimo (+ tabella da sezione 4.2.1 della JLS). Per ricordare meglio questi valori, tenere a mente che i valori negativi sono in totale 2x-1 e partono da -1, quindi il minimo è 2x-1, mentre i valori positivi sono in totale 2x-1 ma partono da 0, non da 1, quindi il massimo è 2x-1-1.
  • Le operazioni bitwise; le bit mask
  • condizioni di errore e differenze con l'aritmetica "normale":
    • l'overflow è quando il risultato è così alto che diventa un numero negativo
    • l'underflow è quando il risultato è così basso che diventa un numero positivo (significato differente rispetto all'underflow dell'aritmetica floating point)
    • gli operatori di modulo e divisione intera lanciano ArithmeticException se il secondo operando è zero (vedi JLS Java Se 7 pagina 44)
  • valori letterali: esistono i valori letterali interi e caratteri. Un valore letterale intero può essere espresso in base 10, 16, 8 o 2 (+ un esempio per ciascuno di questi casi). Può contenere degli underscore, per leggibilità (+ esempio in base 2). Può essere di tipo int (nessun suffisso) o long (suffisso l o L).
    Formalmente, un valore letterale ha tipo int o long, quindi una istruzione come "short s = 15;" non sarebbe consentita; per questo, è stata introdotta una regola apposita, "widening conversion delle costanti" (JLS 2nd edition, 5.2) che converte in automatico senza dover usare un cast (rendendo quindi lecita quella istruzione).
    Vedi