|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 659
|
[JAVA] Perdo 256
Codice:
byte z1 = (byte) (4500>>8); println(Integer.toBinaryString(z1)); byte z2 = (byte)(4500); println(Integer.toBinaryString(z2)); int z3 = ((z1<<8)+ z2); println(z3); 10001 11111111111111111111111110010100 4244 Perchè ho perso 256? Perchè il secondo Byte ha così tante cifre? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Il valore letterale intero 4500 in binario è:"1000110010100".
Poi tu forzi il cast a byte. Il tipo Byte è formato di 8 bit, cioè 8 cifre binarie. Se tronchi "1000110010100" a 8 cifre resta la parte: "xxxxx10010100" e il resto è perso nella conversione. In Java i tipi primitivi sono tutti trattati come signed, non esiste il concetto di unsigned type. Quindi qua: Codice:
Integer.toBinaryString(z2) "z2" "unsigned" dovrebbe essere convertito come un int di valore "00000000 00000000 00000000 10010100" (148 in decimale), invece viene trattato come tipo signed e viene convertito in un int di valore "11111111 11111111 11111111 10010100" (-108 in decimale) Prova a fare così: Codice:
byte z1 = (byte) (4500>>8);
println(Integer.toBinaryString(z1));
byte z2 = (byte)(4500);
int z2Cast = unsignedByteToInt(z2);
println(Integer.toBinaryString(z2Cast));
int z1Cast = unsignedByteToInt(z1);
int z3 = (z1Cast << 8) + z2Cast;
println(z3);
// da qualche parte, qualcosa tipo:
public static int unsignedByteToInt(byte b) {
return ((int) b) & 0xFF;
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 12-06-2012 alle 14:35. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 659
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2781
|
4500 in binario è:
0001 0001 1001 0100 Mettendolo in un byte hai una perdita, esso viene troncato e diventa: 1001 0100 il cui valore è -108 (il primo bit è il bit di segno) Integer.toBinaryString si aspetta un int, quando lo invochi quindi il byte viene automaticamente castato a int e in questo caso la conversione è senza perdita, ma su 4 byte -108 viene rappresentato come 1111 1111 1111 1111 1111 1111 1001 0100 Riguardo a questo invece: Codice:
int z3 = ((z1<<8)+ z2); 0001 0001 0000 0000 cioè 4352 anche z2, per via dell'operatore + viene castato implicitamente a int (ma non è particolarmente rilevante sottolinearlo). In ogni caso z2 vale -108 come detto più su. Quindi l'operazione diventa 4352 - 108 cioè appunto 4244 Reference: http://docs.oracle.com/javase/specs/...tml/jls-5.html EDIT: avevo scritto la prima parte e dopo pranzo ho finito, non ho visto che nel frattempo ti avevano già risposto... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 659
|
Grazie Mille ad Entrambi
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:38.




















