Pourquoi Java est-il capable de stocker 0xff000000 en tant qu'entier?
Question
La valeur maximale d’un entier en Java est 2147483647, car les entiers Java sont signés, non?
0xff000000 a une valeur numérique de 4278190080.
Pourtant, le code Java ressemble à ceci:
int ALPHA_MASK = 0xff000000;
Quelqu'un peut-il m'éclairer s'il vous plaît?
La solution
Le bit haut est un bit de signe. Le réglage indique un nombre négatif: -16777216.
Java, comme la plupart des langues, stocke les numéros signés sous le format de complément . Dans ce cas, soustraire 2 31 , ou 2147483648 à 0x7F000000, ou 2130706432, donne -16777216.
Autres conseils
Juste un ajout à la réponse d'Erickson:
Comme il l’a dit, les entiers signés sont stockés sous forme de complément à deux de leurs valeurs positives respectives sur la plupart des architectures informatiques.
C’est-à-dire que l’ensemble des 2 ^ 32 valeurs possibles sont divisées en deux ensembles: un pour les valeurs positives commençant par un bit 0 et un pour les valeurs négatives commençant par un 1.
Maintenant, imaginez que nous soyons limités à des nombres à 3 bits. Disons-les de façon amusante et logique dans un instant:
000
111 001
110 010
101 011
100
Vous voyez que tous les nombres du côté gauche commencent par un 1 bit tandis que ceux du côté droit commencent par un 0. Par notre décision précédente de déclarer le premier négatif, le second positif voyez que 001, 010 et 011 sont les seuls nombres positifs possibles alors que 111, 110 et 101 sont leurs homologues négatifs respectifs.
Maintenant, que faisons-nous avec les deux nombres qui se trouvent en haut et en bas, respectivement? 000 devrait être zéro, évidemment, et 100 sera le plus petit nombre négatif de tous ceux qui n'ont pas de contrepartie positive. Pour résumer:
000 (0)
111 001 (-1 / 1)
110 010 (-2 / 2)
101 011 (-3 / 3)
100 (-4)
Vous remarquerez peut-être que vous pouvez obtenir le modèle de bits de -1 (111) en inversant 1 (001) et en lui ajoutant 1 (001): 001 (= 1) - > 110 + 001 - > 111 (= -1)
Revenons à votre question:
0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000
Il n'est pas nécessaire d'ajouter d'autres zéros devant, car nous avons déjà atteint le maximum de 32 bits. De plus, c'est évidemment un nombre négatif (comme il commence par un 1 bit), donc nous allons maintenant calculer sa valeur absolue / contrepartie positive:
Cela signifie que nous prendrons le complément à deux de
1111 1111 0000 0000 0000 0000 0000 0000
qui est
0000 0000 1111 1111 1111 1111 1111 1111
Ensuite, nous ajoutons
0000 0000 0000 0000 0000 0000 0000 0001
et obtenez
0000 0001 0000 0000 0000 0000 0000 0000 = 16777216
Par conséquent, 0xff000000 = -16777216.
Quelque chose mérite probablement d'être signalé - ce code n'est pas destiné à être utilisé comme un entier avec une valeur numérique; Le but est en tant que masque de bits de filtrer le canal alpha sur une valeur de couleur de 32 bits. Cette variable ne devrait même pas être considérée comme un nombre, mais simplement comme un masque binaire avec les 8 bits supérieurs activés.
le bit supplémentaire est pour le signe
Les éléments Java sont deux compléments
.Les entrées sont signées en Java.