Frage

Eine Maximalwert der Ganzzahl in Java ist 2147483647, da Java ganze Zahlen signiert sind, nicht wahr?

0xFF000000 hat einen numerischen Wert von 4278190080.

Doch ich sehe, Java-Code wie folgt aus:

int ALPHA_MASK = 0xff000000;

Kann jemand mich aufklären bitte?

War es hilfreich?

Lösung

Das hohe Bit ist ein Vorzeichenbit. Eine Einstellung bezeichnet eine negative Zahl: -16777216.

Java, wie die meisten Sprachen, unterzeichnet speichert Zahlen in 2er- Komplement Form. In diesem Fall subtrahiert 2 31 oder von 0x7F000000 2147483648 oder 2130706432 Ausbeuten -16.777.216.

Andere Tipps

Nur eine Ergänzung zu Ericksons Antwort:

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

Das heißt, die gesamten 2 ^ 32 möglichen Werte sind in zwei Sätze aufgespalten. Ein für positive Werte mit einem 0-Bit und einem für mit einem 1 beginnen negative Werte beginnend

Nun, sich vorstellen, dass wir auf 3-Bit-Zahlen begrenzt sind. Lassen Sie uns sie in einer lustigen Art und Weise organisieren, die Sinn in einem zweiten machen werden:

     000
  111   001 
110       010
  101   011  
     100  

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

Nun, was wir mit den beiden Zahlen zu tun, die oben und unten sind jeweils? 000 sollte Null, offensichtlich sein, und 100 wird die niedrigste negative Zahl aller sein, die kein positives Gegenstück hat. 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 bekommen (111) durch Negieren 1 (001) und die Zugabe von 1 (001), um es: 001 (= 1) -> 110 + 001 -> 111 (= -1)

Kommen wir zurück zu Ihrer Frage:

0xFF000000 = 1111 1111 0000 0000 0000 0000 0000 0000

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

Das heißt, wir werden das Zweierkomplement nehmen von

1111 1111 0000 0000 0000 0000 0000 0000

was

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.

Etwas wohl erwähnenswert, - dieser Code nicht mit einem numerischen Wert als eine ganze Zahl verwendet werden soll; Der Zweck ist, als eine Bitmaske des Alpha-Kanal aus einem 32-Bit-Farbwert zu filtern. Diese Variable sollte wirklich nicht einmal als Zahl gedacht werden, ebenso wie eine binäre Maske mit den hohen 8 Bits eingeschaltet.

das zusätzliche Bit ist für das Zeichen

Java Ints sind Zweierkomplement

ints sind signiert in Java.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top