11 Stimmen

Warum kann Java 0xff000000 als int speichern?

Der maximale Wert eines Integer in Java beträgt 2147483647, da Java-Integer vorzeichenbehaftet sind, richtig?

0xff000000 hat einen numerischen Wert von 4278190080.

Dennoch sehe ich Java-Code wie diesen:

int ALPHA_MASK = 0xff000000;

Kann mich bitte jemand aufklären?

43voto

balu Punkte 3245

Nur eine Ergänzung zu Ericksons Antwort:

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

Das heißt, die gesamten 2^32 möglichen Werte werden in zwei Sätze aufgeteilt: einen für positive Werte, die mit einem 0-Bit beginnen, und einen für negative Werte, die mit einer 1 beginnen.

Stellen Sie sich nun vor, wir sind auf 3-Bit-Zahlen beschränkt. Lassen Sie sie auf eine lustige Weise anordnen, die gleich Sinn machen wird:

     000
  111   001 
110       010
  101   011  
     100  

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, die erstere als negativ und die letztere als positiv zu erklären, sehen wir, dass 001, 010 und 011 die einzigen möglichen positiven Zahlen sind, während 111, 110 und 101 ihre entsprechenden negativen Gegenstücke sind.

Was machen wir jetzt mit den beiden Zahlen oben und unten? 000 sollte offensichtlich null sein und 100 wird die niedrigste negative Zahl von allen sein, die keine positive Entsprechung hat. Zusammengefasst:

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

Sie werden vielleicht feststellen, dass Sie das Bitmuster von -1 (111) bekommen, indem Sie 1 (001) negieren und 1 (001) hinzufügen: 001 (= 1) -> 110 + 001 -> 111 (= -1)

Zurück zu Ihrer Frage:

0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000

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

Dies bedeutet, wir nehmen das Zweierkomplement von

1111 1111 0000 0000 0000 0000 0000 0000

welches ist

0000 0000 1111 1111 1111 1111 1111 1111

Dann addieren wir

0000 0000 0000 0000 0000 0000 0000 0001

und erhalten

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216

Also ist 0xff000000 = -16777216.

26voto

erickson Punkte 256579

Das hohe Bit ist ein Vorzeichenbit. Wenn es gesetzt ist, deutet dies eine negative Zahl an: -16777216.

Java speichert, wie die meisten Sprachen, signierte Zahlen in 2er-Komplement Form. In diesem Fall ergibt die Subtraktion von 231 oder 2147483648 von 0x7F000000 oder 2130706432 -16777216.

8voto

Chris Shaffer Punkte 31499

Etwas, das wahrscheinlich erwähnenswert ist - dieser Code ist nicht dazu gedacht, als Integer mit einem numerischen Wert verwendet zu werden; Der Zweck besteht darin, als Bitmaske verwendet zu werden, um den Alpha-Kanal aus einem 32-Bit-Farbwert herauszufiltern. Diese Variable sollte wirklich nicht einmal als Zahl betrachtet werden, sondern nur als eine binäre Maske mit den hochgeschalteten 8 Bits.

1voto

Jimmy Punkte 85199

Das Extra-Bit ist für das Vorzeichen

Java ints sind Zweierkomplement

0voto

Uri Punkte 86472

Ganzzahlen sind in Java signiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X