예기치 않은 동작: Java 바이트 변환 질문
Java에서 int를 바이트로 변환할 때 -124라는 예기치 않은 결과가 발생합니다. 다음 코드 조각은 사람들의 눈길을 사로잡습니다.
수수께끼 탐구
이 미스터리를 풀려면 Java의 원시 데이터 유형의 복잡성을 탐구해야 합니다. . 32비트에 걸쳐 있는 정수와 8비트에 걸쳐 있는 바이트는 저장 용량이 다릅니다. 바이트를 포함한 대부분의 기본 유형은 부호가 있습니다. 즉, 2의 보수 인코딩을 사용하여 양수 값과 음수 값을 모두 나타냅니다.
부호 비트 지배력
2의 보수에서 가장 유효 비트(MSB)가 부호를 결정합니다. 바이트를 int로 변환하면 MSB가 새 MSB 전체에 복제됩니다. 따라서 8비트 바이트 255(11111111)는 32비트 int 111111111111111111111111101010101이 됩니다.
음수 기만
음수 2의 보수를 해석하려면 첫 번째 MS를 찾는 것이 필요합니다. 비 왼쪽에서 오른쪽으로 그리고 모든 후속 비트를 반전시킵니다. 위의 255를 int로 표현하면 00000000000000000000000001111111 = -1이 됩니다. 이는 Java가 부호 있는 값 132인 -124를 표시하는 이유를 설명합니다.
부호 없는 진실 공개
바이트의 부호 없는 값을 알아내기 위해 비트마스크( 0xff)는 최하위 8비트를 분리하여 불필요한 부호 비트를 제거합니다. 이 마스킹 연산을 바이트 signedByte = -1에 적용하면 부호 없는 값 unsignedByte = 255가 생성됩니다.
Bitwise Magic
Bitwise AND는 불필요한 부호 비트를 마스크합니다. int가 바이트로 변환되면 Java는 상위 24비트를 버립니다. 마스킹을 사용하면 부호 비트가 이제 0이므로 Java에서 남아 있는 8비트를 양수 값으로 해석합니다.
바이트의 음모 마스킹 해제
이 동작이 강조됩니다. 숫자의 부호 있는 표현과 부호 없는 표현 간의 중요한 차이점과 데이터 유형 변환 중 비트 수준 작업이 수행됩니다. 이러한 원칙을 이해함으로써 Java에서 바이트 변환의 수수께끼를 해독하고 예상치 못한 결과를 피할 수 있습니다.
위 내용은 Java에서 `int`를 `byte`로 캐스팅하면 예상치 못한 부정적인 결과가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!