Ho iniziato a studiare JAVA. Lì dentro,
byte ch=50;
ch*=2;
funziona bene. Ma
byte ch=50;
ch=ch*2;
no. errore: possibile perdita di precisione richiesta: Byte trovato: int
Perché questo non accade nel primo caso.
Il secondo caso contiene un'espressione di moltiplicazione generale, che è di tipo int
, e l'assegnazione di int
a byte
non funziona perché potrebbe verificarsi una perdita di informazioni (ci sono molti più valori di byte).
Ma il primo contiene solo un operatore *=
e quell'operatore è ben definito per qualsiasi valore di input, quindi non si verifica alcuna perdita. Il trucco è che byte
è definito come "wrap around" quando superi il suo range tramite aritmetica, quindi un risultato tecnicamente corretto (anche se non molto utile) può essere calcolato.
In altre parole, la perdita si verifica ancora, ma dal momento che è definita per verificarsi nella definizione della lingua, il compilatore non si lamenta. (C'è un suggerimento nelle specifiche, che dice il risultato dell'operazione binaria viene convertito nel tipo della variabile di sinistra , Java Specification 1.7 ) Non esiste una regola definita per l'assegnazione; assegnando 12345 a un byte non produce silenziosamente Byte.MAX_VALUE
, invece è semplicemente un errore di tipo.
E perché le cose sono andate così? Perché tutte le alternative ovvie sarebbero andate peggio! Se l'aritmetica dei numeri interi non si avvolge, dovrebbe generare un'eccezione (cattiva) o produrre risultati non definiti ( molto non validi), oppure dovrebbe essere disabilitata a meno che il compilatore non provi che l'overflow non si verificherà (praticamente impossibile da garantire). Quindi abbiamo preso il wrapping silenzioso come l'alternativa meno cattiva.
Ma con il compito possiamo usare il sistema di tipo strong per catturare tutte le possibili situazioni di overflow e consentire la maggior parte usi ragionevoli, quindi è stata scelta l'opzione.
non seguire alcuna risposta sopra, ti darò una risposta definitiva: Java Ha un concetto chiamato promozione automatica. Vedi sotto Esempio: ciao è 8 bit, quindi l'intervallo massimo del valore del byte è: 2 ^ 8 = 256. Da -128 a -1 e da 0 a 127. Esempio: se byte a = 100, b = 28; entrambi sono validi ma byte sum = a + b; // ne risulterà 128 che non si trova nell'intervallo di byte. ecco perché, il compilatore converte automaticamente il byte in int. int è 32 bit. quindi, 2 ^ 32 è un intervallo di valori molto ampio che può contenere risultati quale byte non può contenere.
java si concentra maggiormente sui dati. Java non consentirà la perdita di dati a differenza di c / c ++ senza la conoscenza dell'utente.
Questo concetto è chiamato promozione automatica.
la promozione automatica viene eseguita anche per byte, short e char. Cerchi di aggiungere caratteri, darà errore in questo modo.
sopra il programma, puoi scrivere così:
byte ch = 50; int ch = ch * 2; // ch è trattato come int e 2 è anche considerato intero letterale.
dato che 50 * 2 è 100, sempre nell'intervallo di byte, qui puoi eseguire il typecasting, ma è rischioso poiché il valore di ch può essere modificato. Funzionerà: così: byte ch = 50; byte ch = (byte) (ch * 2); // cast di tipo manuale
Leggi altre domande sui tag java