Warum ist Java können als int speichern 0xFF000000?
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?
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.