흥미로운 Int 및 바이트 변환 이상
Java에서 int를 바이트로 변환할 때 동작이 예상치 못한 것처럼 보일 수 있습니다. 특히 명백한 측면을 고려하면 더욱 그렇습니다. 데이터가 손실되고 결과 바이트에 음수 부호가 할당됩니다. 이 수수께끼를 풀기 위해 기본 데이터 유형과 2의 보수 표현의 복잡성을 자세히 살펴보겠습니다.
기본 유형 및 2의 보수 이해:
Java에서는 int가 차지합니다. 32비트인 반면, 1바이트는 고작 8비트를 차지합니다. 또한 int 및 byte와 같은 기본 유형은 2의 보수 표현을 따릅니다. 이 방식에서는 최상위 비트(MSB)가 부호를 결정하고 추가 비트가 복제로 이어집니다.
Int에서 바이트로의 비트별 변환:
int를 바이트로 변환하면 Java는 최하위 8비트만 추출하고 그에 따라 값을 할당합니다. 그러나 이제 바이트의 부호 비트인 int의 MSB가 결과에 중요한 역할을 합니다.
숨겨진 진실 밝히기:
난처한 예:
int i = 132; byte b = (byte)i; // Implicit narrowing conversion System.out.println(b); // Prints -124
132의 32비트 이진 표현:
00000000000000000000000010000100
최하위 8비트(10000100) 추출:
10000100
변환 중 2의 보수 표현으로:
11111000
Java는 반전된 비트 패턴으로 인해 이를 음수 값으로 해석하여 -124가 인쇄됩니다.
수수께끼 풀기:
바이트의 원래 8비트 부호 없는 값을 검색하려면 비트 AND 연산을 수행할 수 있습니다.
byte signedByte = -124; int unsignedByte = signedByte & 0xff; // 0xff = 11111111b
이 연산은 외부 부호 비트를 마스크하여 다음 결과를 산출합니다. :
Unsigned value: 10000100 (84 in decimal)
계략 요약:
int-to-byte 변환 중에 Java는 암시적 축소를 통해 가장 왼쪽 24비트를 무시합니다. 원래 int의 8번째 비트인 부호 비트는 바이트의 MSB가 되어 해석에 영향을 줍니다. 부호 없는 값을 공개하려면 비트 AND 연산이 필요하며 부호 비트를 효과적으로 지웁니다.
위 내용은 Java에서 int를 바이트로 변환하면 음수 값이 나오는 이유는 무엇이며, 부호 없는 원래 값을 어떻게 검색할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!