Letterali binari Java-Valore -128 per byte
Poiché SE 7 Java consente di specificare valori come letterali binari. La documentazione mi dice che 'byte' è un tipo che può contenere 8 Bit di informazioni, i valori da -128 a 127.
Ora non so perché, ma non posso definire 8 bit ma solo 7 se provo ad assegnare un letterale binario a un byte in Java come segue:
byte b = 0b000_0000; //solves to the value 0
byte b1 = 0b000_0001; //solves to the value 1
byte b3 = 0b000_0010; //solves to the value 2
byte b4 = 0b000_0011; //solves to the value 3
E così via fino ad arrivare alle ultime possibilità usando quei 7 bit:
byte b5 = 0b011_1111; //solves to the value 63
byte b6 = 0b111_1111; //solves to the value 127
Se voglio rendere i numeri negativi devo aggiungere un leading-in front come questo:
byte b7 = -0b111_1111; //solves to the value -127
Ora metà del problema che ho è che uso solo 7 bit per descrivere quello che mi dicono è un tipo di dati a 8 bit. La seconda metà è che non sembrano essere filettati come complemento a due a meno che non si utilizzi un tipo int a 32 bit in cui posso definire tutti i 32 bit (incluso"sign indicator bit").
Ora quando cerco su come visualizzare il numero in-range -128 mi è stato detto di farlo in questo modo senza ulteriori spiegazioni:
byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000;
Posso vedere chiaramente che l'ultimo 8 Bit (1000 0000) rappresentano -128 in due compelment usando 8 Bit, ancora non sono mai stato confuso di più e cerco di fare le mie domande:
- Non è il precedente nr lungo 32 bit un valore int a 32 bit (java -)?
- Perché posso assegnare un valore a 32 bit a un tipo di byte a 8 bit (java -)?
O in generale: Perché devo assegnarlo in questo modo?
Qualsiasi link / informazione su questo sarebbe fantastico! Grazie per il tempo che hai dedicato a leggere questo e qualsiasi altra informazione preventivamente.
Saluti Gen
1 answers
Secondo le specifiche Java,
Http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
tutti le tue dichiarazioni (b, b1,..., e b8) usa int letterali, anche quando si inserirebbero in un byte. Non c'è un byte letterale in Java, puoi usare solo un int per inizializzare un byte.
Ho fatto alcuni test e byte neg128 = -0b1000_0000;
funziona bene. 0b1000_0000
è 128, quindi devi solo mettere un segno -
prima di esso. Si noti che che 1
non è un sign bit a tutti (non pensare a byte a 8 bit, pensa a int a 32 bit convertiti in byte). Quindi se vuoi specificare il bit del segno devi scrivere tutti i 32 bit, come hai dimostrato.
Quindi byte b8 = 0b1000_0000;
è un errore proprio come byte b8 = 128;
è un errore (+128 non si adatta a un byte). Puoi anche forzare la conversione con un cast:
byte b = (byte) 0b1000_0000;
o
byte b = (byte) 128;
Il cast dice al compilatore che sai che 128 non si adatta a un byte e il modello di bit verrà reinterpretato come -128.