Warum kann Java 0xff000000 als int speichern?

8

Der Maximalwert einer ganzen Zahl in Java ist 2147483647, da Java-Ganzzahlen signiert sind, oder?

0xff000000 hat einen numerischen Wert von 4278190080.

Aber ich sehe Java-Code wie folgt:

%Vor%

Kann mich bitte jemand aufklären?

    
kitsune 25.11.2008, 23:00
quelle

5 Antworten

25

Das High-Bit ist ein Vorzeichenbit. Einstellen bedeutet eine negative Zahl: -16777216.

Java speichert, wie die meisten Sprachen, vorzeichenbehaftete Zahlen im 2er-Komplement -Formular. In diesem Fall ergibt das Subtrahieren von 2 31 oder 2147483648 von 0x7F000000 oder 2130706432 -16777216.

    
erickson 25.11.2008, 23:03
quelle
39

Nur eine Ergänzung zu Ericksons Antwort:

Wie er sagte, werden vorzeichenbehaftete Integer als Zweierkomplemente zu ihrem jeweiligen positiven Wert auf den meisten Computerarchitekturen gespeichert.

Das heißt, die ganzen 2 ^ 32 möglichen Werte sind in zwei Mengen aufgeteilt: eine für positive Werte beginnend mit einem 0-Bit und eine für negative Werte beginnend mit einer 1.

Stellen Sie sich vor, wir sind auf 3-Bit-Zahlen beschränkt. Lass uns sie auf eine lustige Art arrangieren, die in Sekundenschnelle Sinn ergibt:

%Vor%

Sie sehen, dass alle Zahlen auf der linken Seite mit einem 1-Bit beginnen, während sie auf der rechten Seite mit einer 0 beginnen. Durch unsere frühere Entscheidung, Ersteres als Negativ und Letzteres als Positiv zu deklarieren, haben wir siehe, dass 001, 010 und 011 die einzig möglichen positiven Zahlen sind, während 111, 110 und 101 ihre jeweiligen negativen Gegenstücke sind.

Was machen wir jetzt mit den zwei Zahlen, die oben und unten sind? 000 sollte natürlich null sein, und 100 wird die niedrigste negative Zahl von allen sein, die kein positives Gegenstück haben. Zusammenfassend:

%Vor%

Sie können feststellen, dass Sie das Bitmuster -1 (111) erhalten, indem Sie 1 (001) negieren und 1 (001) hinzufügen: 001 (= 1) - & gt; 110 + 001 - & gt; 111 (= -1)

Zurück zu Ihrer Frage:

0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000

Wir müssen keine weiteren Nullen davor einfügen, da wir bereits das Maximum von 32 Bit erreicht haben. Außerdem ist es offensichtlich eine negative Zahl (da es mit einem 1-Bit beginnt), also werden wir nun seinen absoluten Wert / positives Gegenstück berechnen:

Das bedeutet, wir nehmen das Zweierkomplement von

%Vor%

was ist

%Vor%

Dann fügen wir

hinzu %Vor%

und erhalten

%Vor%

Daher 0xff000000 = -16777216.

    
balu 25.11.2008 23:42
quelle
7

Etwas, das wahrscheinlich erwähnenswert ist - dieser Code soll nicht als Integer mit einem numerischen Wert verwendet werden; Der Zweck ist eine Bitmaske, um den Alpha-Kanal aus einem 32-Bit-Farbwert zu filtern. Diese Variable sollte eigentlich nicht einmal als Zahl betrachtet werden, genauso wie eine binäre Maske mit den hohen 8 Bits, die eingeschaltet sind.

    
Chris Shaffer 26.11.2008 00:02
quelle
1

das Extra-Bit ist für das Zeichen

Java-Ints sind Zweierkomplement

    
Jimmy 25.11.2008 23:02
quelle
0

ints sind in Java signiert.

    
Uri 25.11.2008 23:06
quelle

Tags und Links