Pregunta

El valor máximo de un entero en Java es 2147483647, ya que los enteros de Java están firmados, ¿verdad?

0xff000000 tiene un valor numérico de 4278190080.

Sin embargo, veo un código Java como este:

int ALPHA_MASK = 0xff000000;

¿Puede alguien iluminarme por favor?

¿Fue útil?

Solución

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

Java, como la mayoría de los idiomas, almacena números firmados en forma de complemento 2 . En este caso, restando 2 31 , o 2147483648 de 0x7F000000, o 2130706432, produce -16777216.

Otros consejos

Solo una adición a la respuesta de erickson:

Como él dijo, los enteros con signo se almacenan como complementos de dos para su respectivo valor positivo en la mayoría de las arquitecturas de computadora.

Es decir, los 2 ^ 32 valores posibles se dividen en dos conjuntos: uno para valores positivos que comienzan con un bit 0 y otro para valores negativos que comienzan con un 1.

Ahora, imagine que estamos limitados a números de 3 bits. Arreglemoslos de una manera divertida que tenga 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 1 bit mientras que en el lado derecho comienzan con un 0. Por nuestra decisión anterior de declarar el primero como negativo y el segundo como positivo, nosotros vea que 001, 010 y 011 son los únicos números positivos posibles, mientras que 111, 110 y 101 son sus respectivos homólogos negativos.

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

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

Puede notar que puede obtener el patrón de bits de -1 (111) al negar 1 (001) y agregarle 1 (001): 001 (= 1) - > 110 + 001 - > 111 (= -1)

Volviendo a su pregunta:

0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000

No tenemos que agregar más ceros delante ya que alcanzamos el máximo de 32 bits. Además, obviamente es un número negativo (ya que comienza con un 1 bit), por lo que ahora vamos a calcular su valor absoluto / contraparte positiva:

Esto significa que tomaremos el complemento de dos de

1111 1111 0000 0000 0000 0000 0000 0000

que es

0000 0000 1111 1111 1111 1111 1111 1111

Luego agregamos

0000 0000 0000 0000 0000 0000 0000 0001

y obtener

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216

Por lo tanto, 0xff000000 = -16777216.

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

el bit extra es para el signo

Las entradas de Java son dos complementos

ints están firmados en Java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top