Java에서 Unsigned를 다루는 방법

signed가 기본이다

byte b = (byte) 128; // -128

byte 자료형에 1바이트(0 ~ 255)를 생각하고 당연하게 127 이상의 값을 집어 넣게 되면 음수 값을 볼 수 있다.

그 이유는?

이미지 출처 : https://www.geeksforgeeks.org/unsigned-char-in-c-with-examples
  • signed(-128 ~ 127)
  • unsigned(0 ~ 255)

자바의 byte는 기본적으로 signed로 돌아가기 때문이다. 제일 앞 비트(MSB)를 부호 비트로 보게 되어 -128 ~ 127 값의 범위를 가지기 때문에 127을 넘어갈 경우 부호가 바뀌어 -128가 된다.

그렇다면 unsigned로 표현하는 법은?

자바에서는 기본적으로 unsigned를 지원하지 않기 때문에 아래와 같이 int로 표현해주게 되면 된다.

byte b = (byte) 128; //-128
int i = (int) b&0xff; //128

byte형을 강제 형변환하게 될 경우 -128이 나오지만, 16진수 255를 나타내는 0xff와 128을 비트연산한 값은 기존의 128이 출력된다.

여담

언어 차원에서 signed만을 기본으로 지원해주는 이유는 제임스 고슬링 아저시가 언어를 설계할 때 signed, unsigned 개념이 나뉘는 게 복잡성을 키운다고 생각했다더라는 얘기가 있다.