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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top