Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11

    Difficoltà con Casting e Promotion.

    Buongiorno a tutti,

    mi chiamo Federico. Sono un principiante nell'ambito della programmazione, tanto che ho appena iniziato a studiare Java (8), tramite un buon libro/manuale che consiglio.
    Tale libro è stato scritto dall'autore Claudio De Sio Cesari.
    A parte ciò, dopo aver iniziato a studiare i "TIPI DI DATI PRIMITIVI", e più precisamente quelli INTERI (byte, short, int, long) ho riscontrato delle difficoltà nel capire i concetti di Cast/Casting e Promotion.
    Nell'esempio riportato:

    byte b = 50;
    b = b * 2;

    La seconda istruzione da un errore in compilazione, poiché il compilatore non esegue l'operazione di moltiplicazione, ma promuove entrambi gli operandi ad "int" e quindi un "int" non può essere immagazzinato in "b" che è un "byte". Fino a qui ho capito.

    Come dice il libro:

    (50 * 2) è immagazzinabile in un "byte", e per fare ciò si utilizza il Cast/Casting che forza una certa quantità ad essere immagazzinata in un certo tipo di dato. Per farlo:

    b = (byte) (b * 2);

    Invece, se noi scrivessimo:

    b = (byte) 128;

    Non ci sarebbero errori in compilazione, ma la variabile "b" avrà valore " - 128 " e non " 128 ".
    Questo è il problema. Non capisco perché si ottiene quel valore.
    Qualcuno, gentilmente, mi potrebbe aiutare?
    Grazie in anticipo, e buona giornata.

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Stavo provando a risponderti, ma mi sa che a spiegare non sono bravissimo, quindi se hai dimistichezza con l'inglese ti propongo di leggere qui
    http://stackoverflow.com/questions/3...to-127-in-java

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    Invece, se noi scrivessimo:

    b = (byte) 128;

    Non ci sarebbero errori in compilazione, ma la variabile "b" avrà valore " - 128 " e non " 128 ".
    Questo è il problema. Non capisco perché si ottiene quel valore.
    128 è una costante "letterale" di tipo int. Scrivendolo in hex è 00000080
    Se fai un cast a byte, di fatto "tronchi" via i 24 bit "alti" del int e rimane quindi 80 (rappresentato qui in esadecimale). Ma ora il byte ha il bit più "alto" a 1 che è il segno, in questo caso negativo!! E quindi è un valore negativo che è -128.

    Questo ha a che fare con la rappresentazione in "complemento a due". Eventualmente documentati su questo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Grazie mille. Ho provato a leggere e ho capito qualcosa.
    Il problema è il complemento a due. Navigando su Wikipedia ho trovato una spiegazione, ma non ho capito appieno il concetto ed inoltre non riesco a capire la sottrazione binaria. (Il "gioco" del prestito).
    Riusciresti a spiegarmela, gentilmente e se hai tempo?
    Grazie.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Ma ora il byte ha il bit più "alto" a 1 che è il segno, in questo caso negativo!! E quindi è un valore negativo che è -128.

    [/QUOTE]

    Mi scusi se la disturbo ancora, ma cosa significa che il tipo di dato intero "byte" ha il bit più alto che è 1?
    Grazie ancora.

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    10000000 in binario = 128 in decimale, ma in complemento a 2 non è 128, bensì -128 perché il bit più significativo è 1 e in complemento a 2 i numeri che cominciano per 1 sono negativi.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Ok capito.
    Grazie mille.

    Vi chiedo un'ultima cosa. Qual è lo scopo di utilizzo sia del Cast che del/della Promotion?
    Chiedo questo, perché personalmente sto studiando Java in modo da poter creare in futuro un videogioco 2d.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    Vi chiedo un'ultima cosa. Qual è lo scopo di utilizzo sia del Cast che del/della Promotion?
    Il cast serve per convertire un valore da un tipo ad un altro tipo. A livello di tipi primitivi, il cast cambia proprio il numero di bit del valore. Se fai un down-cast cioè da un tipo più grande ad uno più piccolo, perdi dei bit, quindi il valore può risultare sballato e completamente alterato (può perdere anche il segno oltre che la grandezza e/o precisione). Se fai un up-cast cioè da un tipo più piccolo ad uno più grande, non ci sono problemi.

    A livello di tipi reference, il cast (up o down) non cambia nulla a livello di bit. Cambia solo la "visione" che si ha di un certo oggetto.

    La (binary o unary) numeric promotion si applica con gli operatori. Quando es. sommi un byte e uno short, cosa deve succedere? Deve esserci un unico tipo finale e ci sono quindi delle regole per determinarlo. In questo caso, byte + short, entrambi i valori vengono portati ad int per fare la somma e il risultato è quindi un int.

    Quote Originariamente inviata da Fedro93 Visualizza il messaggio
    Chiedo questo, perché personalmente sto studiando Java in modo da poter creare in futuro un videogioco 2d.
    Te le dico in modo buono, ti ci vorrà ancora un bel po' prima di arrivare a quell'obiettivo. Continua a studiare Java, buon studio! E se hai dubbi, continua pure a chiedere.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2016
    residenza
    Italia, Scomigo (TV)
    Messaggi
    11
    Grazie mille per l'aiuto che mi avete fornito.
    Buona giornata in ritardo.

Tag per questa discussione

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.