PDA

Visualizza la versione completa : [Java] Cast


Zitrog
18-04-2003, 11:46
Mi vergogno un pò a fare questa domanda...:adhone:

Mi chiedevo come mai facendo un cast per esempio da int a byte per un numero troppo grande (x il campo di esistenza dei byte) ottenga un numero negativo

Esempio pratico:


int i = 128;
int h = 130;
byte b;

b = (byte)i;
System.out.println(b); // Ottengo -128
b = (byte)h;
System.out.println(b); // Ottengo -126


Credo che la spiegazione di tutto stia nel complemento a due...ma non ho ben chiaro il perchè...

Qualcuno mi illumina pls :)

l.golinelli
18-04-2003, 11:48
Perdi la precisione e conseguentemente il valore della variabile...

Il cast forzato si fa di solito da un tipo più piccolo a uno più grande int -> long

Zitrog
18-04-2003, 11:50
ahh sisi certo

Ma mi chiedevo il perchè si ottenga quel risultato

...proprio la logica con cui il compilatore torna fuori -128 anzichè un altro numero

floyd
18-04-2003, 13:24
cerca il metodo per la sottrazione con bit e capirai :tongue:

battlehorse
18-04-2003, 17:05
Per come viene é strutturata su un calcolatore la rappresentazione binaria di un numero negativo (di solito si usa il complemento a 1 o a 2), cercare di rappresentare un numero oltre il limite massimo consentito equivale a "ripartire" dall'estremo inferiore della scala dei numeri rappresentabili con i bit a disposizione.

Mi spiego meglio. Un byte equivale a un campo di 8 bit, il che significa che possiamo rappresentare al massimo 255 numeri. Nella fattispecie si sceglie l'intervallo -128 : +127.

Se ora hai in una variabile il valore 126 e aggiungi 1 ottieni 127.
Se a 127 aggiungi di nuovo 1 "torni indietro" e ottieni l'estremo inferiore della scala. Cioe' -128.

Se a 127 aggiungi 2 otterrai -127 e cosi' via.

Il trucco sta nel fatto che in base 2, il numero 127 equivale a

1111 1111

aggiungendo 1 il riporto viene passato di posizione in posizione fino a che non "esce" dal registro di 8 bit disponibili e ottieni

0000 0000

che appunto e' la rappresentazione con la tecnica del complemento di -128.

r0x
18-04-2003, 21:52
Il trucco sta nel fatto che in base 2, il numero 127 equivale a

1111 1111

aggiungendo 1 il riporto viene passato di posizione in posizione fino a che non "esce" dal registro di 8 bit disponibili e ottieni

0000 0000

che appunto e' la rappresentazione con la tecnica del complemento di -128.


Scherzi? :p

kuarl
19-04-2003, 10:02
non è proprio così, la tecnica del complemento a 2 la si ottiene vacendo l'or logico di tutti i bit e sommando 1

r0x
19-04-2003, 15:22
la tecnica del complemento a 2 la si ottiene vacendo l'or logico di tutti i bit e sommando 1


L`or logico? E con cosa?

battlehorse
19-04-2003, 17:32
Per Rox :

ok, ho scritto un po' di caxxate! :tongue:

L'esame di architettura degli elaboratori l'ho dato un po' di tempo fa e non avevo voglia di ripescare gli appunti. Comunque esempio specifico a parte il discorso e' quello : la questione del riporto fa si che si abbia questa "congiunzione" tra il piu' grande numero positivo e il piu' grande negativo nella scala dei numeri rappresentabili con i bit dati.

Ciau!

battlehorse
19-04-2003, 17:48
e ovviamente mi sottopongo alla pena di 10 frustate per aver scritto 127 come 1111 1111 ... :D

Loading