Java가 0xff000000을 INT로 저장할 수있는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/319199

  •  11-07-2019
  •  | 
  •  

문제

Java의 정수의 최대 값은 2147483647입니다.

0xff000000의 숫자 값은 4278190080입니다.

그러나 나는 다음과 같은 Java 코드를 본다.

int ALPHA_MASK = 0xff000000;

누구든지 나를 깨달을 수 있습니까?

도움이 되었습니까?

해결책

높은 비트는 부호입니다. 설정은 마이너스 숫자를 나타냅니다 : -16777216.

Java, 대부분의 언어와 마찬가지로 상점에 서명 된 숫자 2의 보완 형태. 이 경우 2를 빼냅니다31, 0x7F000000 또는 2130706432에서 2147483648 -16777216을 생산합니다.

다른 팁

Erickson의 답변에 추가 :

그가 말했듯이, 서명 된 정수는 대부분의 컴퓨터 아키텍처에서 각각의 긍정적 가치에 대한 두 가지 보완 물로 저장됩니다.

즉, 전체 2^32 가능한 값은 두 세트로 나뉩니다. 하나는 0 비트로 시작하는 양수 값과 1로 시작하는 음수 값의 경우.

이제 우리는 3 비트 숫자로 제한되어 있다고 상상해보십시오. 잠깐만 할 수있는 재미있는 방식으로 그들을 배열합시다.

     000
  111   001 
110       010
  101   011  
     100  

왼쪽의 모든 숫자는 1 비트로 시작하는 반면 오른쪽에서는 0으로 시작한다는 것을 알 수 있습니다. 이전의 이전 결정에 따르면 전자를 부정적인 것으로 선언하고 후자는 긍정적으로 선언합니다. , 010 및 011은 가능한 유일한 양수 인 반면 111, 110 및 101은 각각의 음의 상대입니다.

이제 우리는 각각 상단과 하단에있는 두 숫자로 무엇을합니까? 000은 분명히 0이어야하며 100은 양의 상대가없는 가장 낮은 마이너스 수가 될 것입니다. 요약:

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

1 (001)을 무효화하고 1 (001)을 추가하여 -1 (111)의 비트 패턴을 얻을 수 있음을 알 수 있습니다. 001 (= 1) -> 110 + 001-> 111 (= -1).

귀하의 질문으로 돌아 오기 :

0xFF000000 = 1111 1111 0000 0000 0000 0000 00000000

우리는 이미 최대 32 비트에 도달 했으므로 앞에 0을 더 추가 할 필요가 없습니다. 또한 분명히 음수 (1 비트로 시작 함)이므로 이제 절대 값 / 양의 상대를 계산할 것입니다.

이것은 우리가 두 사람의 보완을 취할 것임을 의미합니다.

1111 1111 0000 0000 0000 0000 0000 0000

그게

0000 0000 1111 1111 1111 1111 1111 1111

그런 다음 우리는 추가합니다

0000 0000 0000 0000 0000 0000 0000 0001

그리고 얻습니다

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216

따라서 0xff000000 = -16777216.

아마도 지적할만한 가치가있는 것 -이 코드는 숫자 값을 가진 정수로 사용되는 것이 아닙니다. 목적은 알파 채널을 32 비트 색상 값으로 필터링하는 비트 마스크입니다. 이 변수는 8 비트가 높은 이진 마스크가 켜진 것처럼 실제로 숫자로 생각해서는 안됩니다.

여분의 비트는 표시를위한 것입니다

Java ints입니다 두 가지 보완

ints는 Java로 서명됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top