Warum byte b = (byte) 0xFF
ist gleich integer
-1
?Warum Byte b = (Byte) 0xFF ist gleich der ganzen Zahl -1?
Ex:
int value = byte b = (byte) 0xFF;
System.out.println(value);
es wird -1
drucken?
Warum byte b = (byte) 0xFF
ist gleich integer
-1
?Warum Byte b = (Byte) 0xFF ist gleich der ganzen Zahl -1?
Ex:
int value = byte b = (byte) 0xFF;
System.out.println(value);
es wird -1
drucken?
Wenn Sie einen vorzeichenbehafteten int verwenden, dann ist 0xFF = -1 aufgrund des 2-Komplements.
Dieser Wiki-Artikel es gut erklärt, finden Sie in der Tabelle auf der rechten Seite: http://en.wikipedia.org/wiki/Two%27s_complement
Da Java (und die meisten Sprachen) mit two's-complement math negativen Integer-Werte darstellen. Im Zweierkomplement repräsentiert 0xFF (11111111) (in einem vorzeichenbehafteten int) den Wert -1.
Bytes sind in Java signiert. In binär 0x00 ist 0, 0x01 ist 1 und so weiter, aber alle 1s (dh 0xFF) ist -1, 0xFE ist -2 und so weiter. Siehe Two's complement, das ist der verwendete Binärcodierungsmechanismus.
b
zu einem int
bei der Bestimmung der Überladung von system.out.println
gefördert wird zu nennen.
Alle Bytes in Java sind signiert. Das vorzeichenbehaftete Byte 0xff
repräsentiert den Wert -1
. Dies liegt daran, dass Java two's complement verwendet, um vorzeichenbehaftete Werte darzustellen. Das vorzeichenbehaftete Byte 0xff
repräsentiert -1
, da sein höchstwertiges Bit 1
ist (daher stellt es einen negativen Wert dar) und sein Wert ist -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
.
Es ist nicht nur Java, das 2-s-Komplement math. So kann jeder Mikroprozessor und jeder DSP, an den ich denken kann, Mathe machen. So, wie jede Programmiersprache es darstellt.
Streng gesagt, einige Sprachen (z. B. C und C++) nicht angeben, welche Darstellung für Ganzzahlen verwendet wird. Es ist plattformspezifisch. Auf der anderen Seite spezifiziert Java * * die Zweierkomplementdarstellung. –
vielleicht kommt Ihre Verwirrung aus warum (byte)0xFF
ist irgendwie gleich (int)0xFFFFFFFF
. Was hier passiert, ist die Heraufstufung von kleineren zu größeren Typen mit Vorzeichen, wobei der kleinere Wert Vorzeichen erweitert ist, wobei das höchstwertige Bit in alle neuen Bits des hochgestuften Werts kopiert wird. ein vorzeichenloser Typ wird nicht vorzeichenerweitert, sie werden null erweitert, die neuen Bits sind immer Null.
Wenn es Ihnen hilft, es zu schlucken, denken Sie daran, jede Integer jeder Größe hat auch einige 'Phantom'-Bits, die zu bedeutend sind, um dargestellt zu werden. Sie sind dort, nur nicht in der Variablen gespeichert. eine negative Zahl hat diese Bits ungleich Null, und positive Zahlen haben alle Nullen für Phantom-Bits, wenn Sie einen kleineren Wert zu einem größeren Wert heraufstufen, diese Phantom-Bits werden zu echten Bits.
reduziert Modulo
Byte = 256 0xff = 255
255/256 -> Rest 255
So 255 - 256 = -1
einfache Logik Prost
Und Java macht Zeichenerweiterung, wenn das Byte zu einem int erweitert wird. http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301
eigentlich Zeichen-Erweiterung ist der richtige Grund –