2016-01-29 7 views
7

Basierend auf der Tatsache, dass ein byte Typ Java ist eine vorzeichenbehaftete 8-Bit two's complement Ganzzahl, warum funktioniert die zweite Art der Deklaration eines Bytes nicht?-128 als binäres Literal in Java

byte ok = -128; 
byte notok = 0b10000000; 

Mein Verständnis ist, dass 1000000-128 sein sollte, aber Java gibt die notok Variable oben sollte ein int und kein byte

Antwort

7

0b10000000 ist ein int wörtliche (= 0b00000000000000000000000010000000) sein, die an +128 entspricht. byte enthält 8 Bits und kann nicht +128 darstellen. Sie können jedoch dieses Ziel zu erreichen, wie folgt:

byte notok = (byte) 0b10000000; 
+0

Meinten Sie, Byte hält 8 Bits? – Uli

+0

@Mickey Nein, '+ 128'. –

+0

@Uli Ja. Korrigiert :) –

4

Eigentlich, wie Eng Fouad erwähnt, 0b10000000 eine ganze Zahl wörtlich zu nehmen. Integer-Literale erzeugen einen int-Wert, dessen Größe in Java 32 Bit beträgt. Der Byte-Datentyp ist eine vorzeichenbehaftete 8-Bit-Zweierkomplement-Ganzzahl.

Das Zuweisen des Integer-Literals zu einem Bytetyp würde nicht funktionieren. Um eine Konvertierung zwischen zwei inkompatiblen Typen zu erstellen, muss eine Umwandlung verwendet werden.

b = (byte)0b10000000;  // (This is narrowing conversion) 

Auch die Darstellung Komplement unterzeichnet 2 von -128 ist 110000000. Aber die MSB 1 kann verworfen werden (stellt ein negatives Vorzeichenbit dar) und daher ist als Zweierkomplementdarstellung von -128 akzeptabel.