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.
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.
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.