2008-11-25 4 views

Répondre

25

Le haut bit est un bit de signe. Le définir indique un nombre négatif: -16777216. Java, comme la plupart des langues, stocke les numéros sous forme de 2's complement. Dans ce cas, en soustrayant 2 , ou 2147483648 de 0x7F000000, ou 2130706432, on obtient -16777216.

0

Les ents sont signés en Java.

39

Juste un ajout à la réponse de erickson:

Comme il le dit, signé entiers sont stockés sous forme de deux compléments de leur valeur de à base positif sur la plupart des architectures informatiques.

C'est, l'ensemble 2^32 valeurs possibles sont divisées en deux groupes: l'un pour les valeurs positives commençant par 0 bits et une pour les valeurs négatives commençant par un 1.

Maintenant, imaginez que nous sont limités à des nombres de 3 bits. Nous allons les organiser de façon amusante qui va faire sens dans une seconde:

 000 
    111 001 
110  010 
    101 011 
    100 

Vous voyez commençant par 1 bit tous les chiffres sur le côté gauche tandis que sur la droite, ils commencent par Par notre décision antérieure de déclarer le premier comme négatif et le dernier comme positif, nous voyons que 001, 010 et 011 sont les seuls nombres positifs possibles tandis que 111, 110 et 101 sont leurs homologues négatifs respectifs.

Maintenant, que faisons-nous avec les deux nombres qui sont en haut et en bas, respectivement? 000 devrait être zéro, évidemment, et 100 sera le nombre négatif le plus bas de tous ce qui n'a 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 que vous pouvez obtenir le modèle binaire de -1 (111) en niant 1 (001) et en ajoutant 1 (001) à elle: 001 (= 1) -> 110 + 001 -> 111 (= -1)

pour revenir à votre question:

0xFF000000 = 0000 0000 1111 1111 0000 0000 0000 0000

Nous ne devons pas ajouter d'autres zéros devant comme nous avons déjà atteint le maximum de 32 bits. En outre, il est de toute évidence un nombre négatif (comme il commence avec un 1-bit), donc nous allons maintenant calculer sa valeur absolue/contrepartie positive:

Cela signifie, nous allons prendre le complément de

de deux
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 obtenir

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

Par conséquent, 0xff000000 = -16777216.

+0

@Kitsune (et/ou toute personne qui ne le sait pas déjà): Ceci est une bonne explication. Cela peut prendre quelques fois pour le lire, mais je vous recommande de le lire jusqu'à ce qu'il soit vraiment logique. –

7

Quelque chose vaut probablement le détour - ce code n'est pas destiné à être utilisé comme un nombre entier avec une valeur numérique; Le but est comme un masque de bits pour 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, tout comme un masque binaire avec les 8 bits élevés activés.

Questions connexes