2013-05-27 10 views
7

Poiché SE 7 Java consente di specificare valori come valori letterali binari. La documentazione dice che 'byte' è un tipo che può contenere 8 bit di informazione, i valori da -128 a 127.Letterali binari Java - Valore -128 per byte

Ora non so perché, ma non posso definire 8 bit ma solo 7 se provo ad assegnare un binario letterale 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 finché arriviamo agli ultimi possibilitys usando quei 7 bit:

byte b5 = 0b011_1111; //solves to the value 63 
byte b6 = 0b111_1111; //solves to the value 127 

Se voglio renderlo numeri negativi dEVO aggiungi un davanti - davanti in questo modo:

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 threaded come complemento a meno che non si usi un tipo int a 32 bit dove posso definire tutti i 32 bit ("bit indicatore di segno" incluso).

Ora, quando faccio una ricerca su come visualizzare l'in-intervallo di numeri -128 mi è stato detto di farlo in questo modo, senza alcuna ulteriore spiegazione:

byte b8 = 0b1111_1111_1111_1111_1111_1111_1000_0000; 

posso vedere chiaramente che l'ultimo 8 Bit (1000 0000) non rappresentano -128 a due a due compelment usando 8 bit, ancora non sono mai stato confuso di più e provare a chiedere le mie domande:

  • Isnt quanto sopra 32 bit lungo nr 32 bit (java-) int valore?
  • Perché è possibile 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/informazioni su questo sarebbe fantastico! Grazie per il tempo che hai dedicato a leggere questo e altre informazioni in anticipo.

saluti gen

+0

fa 'byte B8 = lavoro 0b1000_0000', cercare anche fino complemento rappresentazione binaria 2 del –

+0

No byte B8 = 0b1000_0000 non funziona, purtroppo ho perso il focus scientifico su questa domanda, ma penso che questo si prevede di non funzionare. Interessante tuttavia che non c'è mai stata una risposta completa su questa domanda, è necessario verificare come impostare un premio su di esso. – JBA

risposta

8

In base alle specifiche Java,

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1

tutti le dichiarazioni (b, b1, ..., e B8) utilizzano int letterali, anche quando si inseriscono in un byte. Non esiste letterale in Java, è possibile utilizzare solo un int per inizializzare un byte.

Ho eseguito alcuni test e byte neg128 = -0b1000_0000; funziona correttamente. 0b1000_0000 è 128, quindi è sufficiente inserire un segno - prima di esso. Si noti che lo 1non è affatto un bit di segno (non pensare ai byte a 8 bit, pensare agli inte 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 come byte b8 = 128; è un errore (+128 non rientra in un byte).È anche possibile forzare la conversione con un cast:

byte b = (byte) 0b1000_0000; o byte b = (byte) 128;

Il cast dice al compilatore che si sa 128 non rientra in un byte e il bit-pattern verrà reinterpretato come -128.

+0

Oh, anche io sono stato un po 'sorpreso dal fatto che 0b1000_0000 non sia esteso automaticamente ai segni in questo caso. :-) – marcus