> Java > java지도 시간 > Java에서 int를 바이트로 변환하면 음수 값이 나오는 이유는 무엇이며, 부호 없는 원래 값을 어떻게 검색할 수 있습니까?

Java에서 int를 바이트로 변환하면 음수 값이 나오는 이유는 무엇이며, 부호 없는 원래 값을 어떻게 검색할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-11-09 09:10:02
원래의
898명이 탐색했습니다.

Why does converting an int to a byte in Java result in a negative value, and how can we retrieve the original unsigned value?

흥미로운 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿