2008-11-25 6 views
8

El valor máximo de un entero en Java es 2147483647, ya que los enteros de Java están firmados, ¿verdad?¿Por qué Java puede almacenar 0xff000000 como int?

0xFF000000 tiene un valor numérico de 4278190080.

Sin embargo, veo el código Java como esto:

int ALPHA_MASK = 0xff000000; 

Puede alguien me ilumine por favor?

Respuesta

25

El bit es un bit de signo. Establecerlo denota un número negativo: -16777216.

Java, como la mayoría de los idiomas, almacena números con signo en el formulario 2's complement. En este caso, restando 2 , o 2147483648 desde 0x7F000000, o 2130706432, produce -16777216.

0

ints están firmados en Java.

39

Sólo una adición a la respuesta de Erickson:

Como se dijo, firmaron enteros se almacenan como de dos complementos a su respectivo valor positivo en la mayoría de las arquitecturas de computadora.

Es decir, el conjunto de 2^32 valores posibles se dividen en dos grupos: uno para los valores positivos que empiezan con un 0 bits y otra para los valores negativos a partir de una 1.

Ahora, imaginemos que nos está limitado a números de 3 bits. Vamos a organizar de una manera divertida que va a tener sentido en un segundo:

 000 
    111 001 
110  010 
    101 011 
    100 

Usted ve que todos los números en el lado izquierdo comienzan con un 1 bit, mientras que en el lado derecho que comienzan con a 0. Por nuestra decisión anterior de declarar a los primeros como negativos y a los últimos como positivos, vemos que 001, 010 y 011 son los únicos números positivos posibles, mientras que 111, 110 y 101 son sus respectivos contrapartes negativos.

Ahora, ¿qué hacemos con los dos números que están en la parte superior e inferior, respectivamente? 000 debe ser cero, obviamente, y 100 será el número negativo más bajo de todos, que no tiene una contraparte positiva. Para resumir:

 000  (0) 
    111 001 (-1/1) 
110  010 (-2/2) 
    101 011 (-3/3) 
    100  (-4) 

Usted puede notar que se puede obtener el patrón de bits de -1 (111) mediante la negación de 1 (001) y añadiendo 1 (001) a la misma: 001 (= 1) -> 110 + 001 -> 111 (= -1)

Volviendo a su pregunta:

0xFF000000 = 0000 0000 1111 1111 0000 0000 0000 0000

Nosotros no tenemos que añadir más ceros delante de ya que ya alcanzamos el máximo de 32 bits. también, obviamente es un número negativo (ya que está comenzando con un 1 bit), por lo que ahora vamos a calcular su valor absoluto/contraparte positiva:

Esto significa, vamos a tomar el complemento de

de los dos
1111 1111 0000 0000 0000 0000 0000 0000 

que es

0000 0000 1111 1111 1111 1111 1111 1111 

luego añadimos

0000 0000 0000 0000 0000 0000 0000 0001 

y obtenga

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

Por lo tanto, 0xff000000 = -16777216.

+0

@Kitsune (y/o cualquier persona que no sepa esto): Esta es una buena explicación. Puede tomar un par de veces leerlo, pero le recomiendo que lo lea hasta que tenga sentido. –

7

Algo que vale la pena señalar: este código no debe usarse como un entero con un valor numérico; El propósito es como máscara de bits para filtrar el canal alfa de un valor de color de 32 bits. Esta variable realmente no debería considerarse como un número, solo como una máscara binaria con los 8 bits altos activados.

Cuestiones relacionadas