2008-11-25 10 views
8

Der Maximalwert einer ganzen Zahl in Java ist 2147483647, da Java-Ganzzahlen signiert sind, oder?Warum kann Java 0xff000000 als int speichern?

0xFF000000 hat einen numerischen Wert von 4278190080.

Doch ich sehe, Java-Code wie folgt aus:

int ALPHA_MASK = 0xff000000; 

Kann mir jemand aufklären bitte?

Antwort

25

Die hohen Bit sind, ist ein Zeichen-Bit. Einstellen bedeutet eine negative Zahl: -16777216.

Java, wie die meisten Sprachen, speichert signierte Nummern in 2's complement Form. In diesem Fall ergibt das Subtrahieren von 2 oder 2147483648 von 0x7F000000 oder 2130706432 -16777216.

0

Ints sind in Java signiert.

39

nur eine Ergänzung zu Ericksons Antwort:

Wie er sagte, unterzeichnete ganze Zahlen als Zweierkomplement Ergänzungen zu ihren jeweiligen positiven Wert auf den meisten Computerarchitekturen gespeichert sind.

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

beginnen, sich vorstellen, dass wir sind auf 3-Bit-Nummern beschränkt. Lassen Sie uns sie in einer lustigen Art und Weise organisieren, die Sinn in einem zweiten machen werde:

 000 
    111 001 
110  010 
    101 011 
    100 

Sie sehen, dass alle Zahlen auf der linken Seite beginnen mit einem 1-Bit, während auf der rechten Seite sie beginnen a 0. Durch unsere frühere Entscheidung, erstere als negativ und letztere als positiv zu erklären, sehen wir, dass 001, 010 und 011 die einzig möglichen positiven Zahlen sind, während 111, 110 und 101 ihre jeweiligen negativen Gegenstücke sind.

Nun, was machen wir mit den zwei Zahlen, die jeweils 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. Fassen wir zusammen:

 000  (0) 
    111 001 (-1/1) 
110  010 (-2/2) 
    101 011 (-3/3) 
    100  (-4) 

Sie können feststellen, dass Sie das Bitmuster von -1 zu bekommen (111) durch Negieren 1 (001) und die Zugabe von 1 (001), um es: 001 (= 1) -> 110 + 001 -> 111 (= -1)

auf Ihre Frage zurückzukommen:

0xFF000000 = 1111 1111 0000 0000 0000 0000 0000 0000

Wir müssen nicht fügen weitere Nullen vor da wir bereits das Maximum von 32 Bit erreicht haben. Außerdem ist es offensichtlich eine negative Zahl (wie es mit einem 1-Bit-Start), so dass wir jetzt ihrem absoluten Wert/positives Gegenstück gehen zu berechnen:

Das heißt, wir werden das Zweierkomplement nehmen von

1111 1111 0000 0000 0000 0000 0000 0000 

die

0000 0000 1111 1111 1111 1111 1111 1111 

Dann fügen wir

0000 0000 0000 0000 0000 0000 0000 0001 

und erhalten

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

Daher 0xff000000 = -16777216.

+0

@Kitsune (und/oder jemand, der das nicht bereits weiß): Dies ist eine gute Erklärung. Es könnte ein paar Mal dauern, es zu lesen, aber ich empfehle Ihnen, es zu lesen, bis es wirklich Sinn macht. –

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 als eine Zahl betrachtet werden, genauso wie eine binäre Maske mit den hohen 8 Bits, die eingeschaltet sind.