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?

Foi útil?

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 de
1111 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top