Por que é Java capaz de armazenar 0xff000000 como um int?
Pergunta
valor máximo do Um inteiro em Java é 2147483647, desde inteiros Java são assinados, certo?
0xff000000 tem um valor numérico de 4278190080.
No entanto, eu ver o código Java como este:
int ALPHA_MASK = 0xff000000;
Alguém pode esclarecer-me por favor?
Solução
A alta bit é um bit de sinal. Definir denota um número negativo: -16777216.
Java, como a maioria das línguas, lojas assinado números na de 2 formulário complemento . Neste caso, subtraindo 2 31 , ou 2147483648 de 0x7F000000, ou 2130706432, rendimentos -16777216.
Outras dicas
Apenas uma adição à resposta de Erickson:
Como ele disse, assinado inteiros são armazenados como dois de complementos ao seu respectivo valor positivo na maioria das arquiteturas de computadores.
Isto é, toda a 2 ^ 32 possíveis valores são divididos em dois conjuntos:. Um para valores positivos começando com um 0-bit e outro para valores negativos começando com um 1
Agora, imagine que estamos limitados a números de 3 bits. Vamos organizá-los de uma forma engraçada que vai fazer sentido em um segundo:
000
111 001
110 010
101 011
100
Você vê que todos os números na mão esquerda início lado com um 1-bit enquanto que no lado da mão direita eles começam com um 0. Por nossa decisão anterior de declarar a primeira como negativo e este último como positivo, ver que 001, 010 e 011 são os únicos possíveis números positivos enquanto que 111, 110 e 101 são as respectivas contrapartidas negativas.
Agora, o que vamos fazer com os dois números que estão na parte superior e na parte inferior, respectivamente? 000 deve ser zero, obviamente, e 100 será o menor número negativo de tudo que não tem uma contrapartida positiva. Para resumir:
000 (0)
111 001 (-1 / 1)
110 010 (-2 / 2)
101 011 (-3 / 3)
100 (-4)
Você pode notar que você pode obter o padrão de -1 (111) pouco negando 1 (001) e adicionando 1 (001) para ele: 001 (= 1) -> 110 + 001 -> 111 (-1 =)
Voltando à sua pergunta:
0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000
Não temos para adicionar mais zeros na frente dele como já atingiu o máximo de 32 bits. Além disso, é obviamente um número negativo (como ele está começando com um 1-bit), por isso estamos indo agora para calcular seu valor absoluto / homólogo positivo:
Isso significa que vamos dar complemento de
os dois de1111 1111 0000 0000 0000 0000 0000 0000
que é
0000 0000 1111 1111 1111 1111 1111 1111
Em seguida, adicione
0000 0000 0000 0000 0000 0000 0000 0001
e obter
0000 0001 0000 0000 0000 0000 0000 0000 = 16777216
Portanto, 0xff000000 = -16777216.
Algo provavelmente vale a pena apontar - este código não se destina a ser usado como um número inteiro com um valor numérico; O objectivo é como uma máscara de bits para filtrar o canal alfa de um valor de cor de 32 bits. Esta variável realmente não deve mesmo ser pensado como um número, assim como uma máscara binária com os altos 8 bits ligado.
o bit extra é para o sinal
ints Java são complemento de dois
ints são assinados em Java.