Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [JAVA]Teoria: Casting

  1. #1

    [JAVA]Teoria: Casting

    Ciao a tutti!!
    Sto leggendo Core Java 2, nel tentativo di capire un po' più di Java, ma un'affermazione mi blocca:

    Se si cerca di definire un cast di un numero di un tipo in un altro e il numero è esterno all'intervallo di valori che può assumere il tipo di destinazione, il risultato è un numero troncato che assume un valore diverso. Per esempio, (byte) 300 da come risultato 44.
    Credo di aver sbagliato a capire qualcosa...
    Se il valore massimo del tipo "byte" è +127, perchè il casting in questo caso da come risultato 44??
    Vi ringrazio per la pazienza e l'attenzione!
    Gato

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Il numero "int" 300 puoi rappresentarlo in binario (in Java sempre su 32 bit) come
    00000000 00000000 00000001 00101100
    Se su questo valore esegui un casting al tipo "byte", quello che stai cercando di fare è di andarlo a mettere dentro una variabile di 8 bit. Ma poichè è evidente che 32 bit non possono stare dentro a 8 bit, Java va a inserire nella nuova variabile solo quello che riesce a farci stare: ovverosia solo gli 8 bit più a destra. Tutto quello che viene prima (cioè i restanti 24 bit) viene troncato.
    Pertanto, la nuova variabile "byte" conterrà il valore binario
    00101100
    che, guarda caso, corrisponde esattamente al valore decimale 44

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Spiegazione perfetta di desa. E aggiungo solo: quando si passa da un tipo integrale più grande ad uno più piccolo (down-cast), non solo si rischia di perdere la "grandezza" del valore ma pure il "segno". Un int 697 convertito in byte porta ad un valore -71 !
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Grazie mille a tutti e due, ora ho capito tutto!
    Gato

  5. #5
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Quello che ti ho descritto è ciò che avviene a "basso livello", ovverosia è ciò che fa Java "fisicamente" con i singoli bit (il procedimento è valido per tutti i tipi di dato INTERI, non solamente con byte e int).
    Da un punto di vista un po' più "alto" ("sotto" Java lavora sempre nello stesso modo, ma quello che alla fine vedi tu - programmatore - sono solitamente numeri decimali, non binari) puoi vedere lo stesso risultato anche in un altro modo. Come probabilmente sai, per come sono rappresentati in binario, succede che i numeri interi siano "circolari": ovverosia, è come se il successivo del più grande numero rappresentabile sia il più piccolo numero rappresentabile. In termini molto più semplici, ragionando con i "byte", se fai 127 + 1 ottieni -128: sforando il valore massimo "riparti" dal valore minimo.
    Riprendiamo ora in mano l'esempio del 300.
    Immagina di dover "riempire" la variabile "byte" partendo da 0 e sommando 1 di volta in volta.
    Naturalmente fino a 127 non ci sono problemi. Rimangono però ancora 300 - 127 = 173 da "piazzare". Andando avanti a sommare 1, succede quello che ti ho descritto: ripartiamo dal valore "minimo" -128 e ci "spostiamo" verso lo 0.
    Arrivati a -1 avremo riempito la variabile con altri 128: restano ancora 173 - 128 = 45. Aggiungiamo 1 per arrivare allo 0... ci restano 44, che è esattamente lo stesso valore che avevamo verificato analizzando la situazione dal punto di vista dei bit.

    E' una proprietà ottenuta per effetto del modo in cui sono organizzati gli interi in Java... e in un certo senso "spiega" proprio quello che diceva andbin

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.