Domanda Casting e promotion

Stato
Discussione chiusa ad ulteriori risposte.

Cad81

Utente Silver
6 Febbraio 2013
80
30
2
96
Ciao ragazzi, sto leggendo il manuale di java 8 (di De Sio) e sono arrivato al capitolo, appunto sul casting e promotion.

l'esempio che riporta è:

Codice:
int a = 2147483647; //massimo valore int
int b = 1;
int risultato = a+b;

il risutato è però -2147483648.

Perchè è tornato al suo valore negativo massimo? E' come se fosse un contachilometri che riparte dal suo minimo, una volta raggiunta la cifra massima?

e quindi, se b fosse stata 5, il risultato sarebbe stato: -2147483644 ?

Grazie!
 
È una caratteristica della rappresentazione binaria dei numeri negativi utilizzata nei computer (complemento a due), se guardi i bit:
Codice:
(numeri a 32 bit)
01111111111111111111111111111111 +   (rappresenta 2147483647)
00000000000000000000000000000001 =   (rappresenta 1)
10000000000000000000000000000000     (con la logica del complemento a due rappresenta -2147483648)

Questo tipo di rappresentazione consente di gestire le sottrazioni come se fossero delle somme ed inoltre ti permette di poter sfruttare bene lo spazio (non ci sono numeri che si ripetono, lo 0 è solo positivo). Sì, se b fosse stato 5 il risultato sarebbe stato quello.
 
Ah ok, quindi si utilizza il primo bit per indicare se il numero è positivo o negativo..ed è per questo che si eleva a "n-1"...giusto?

Se è così, ho capito il concetto, ma devo legger meglio sulla pagina linkata per vedere esattamente come funziona la somma

Grazie :)
 
Non è proprio così, se si utilizzasse un bit per indicare se è positivo o negativo si avrebbero due 0 (+0 e -0). Con il complemento a due il primo bit indica il segno e l'ordine dei numeri è al contrario: tutti 1 indica il più piccolo numero negativo (ovvero -1) e 1 seguito da tutti 0 indica il numero negativo più grande.

Per trasformare un numero positivo in complemento a 2 basta scambiare tutti gli 1 con gli 0 e vice versa (ovvero fare il complemento a 1) e sommare 1 a quello che si ottiene. Esempio:
Codice:
00001001   (9)
--------
11110110 + (inverto gli 0 e gli 1)
00000001 = (sommo 1)
--------
11110111   (-9 in complemento a 2)

Quanto fa 5 - 9? Faccio 5 + (-9)
00000101 + (5)
11110111 = (-9)
--------
11111100   (ora vedo che numero è, rifaccio il complemento a 2 per renderlo positivo)

11111100
--------
00000011 +
00000001 =
--------
00000100   (4)

Quindi 5 -9 fa -4
Ho fatto una sottrazione tramite una somma, mi è bastato fare il complemento a 2 del sottraendo
 
  • Mi piace
Reazioni: Cad81
Stato
Discussione chiusa ad ulteriori risposte.