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

Author: JBA, 2013-05-27

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.

 8
Author: marcus, 2013-09-23 13:20:19