컴퓨터는 음수를 맨 앞 자리를 1이면 음수로 인식, 0이면 양수로 인식한다.

Java 자료형 byte인 경우 1byte는 8bit이므로 8칸을 사용하게 되고, 맨 앞자리는 부호 표현으로 쓰여 

-128(10000000)~127(01111111)까지 표현할 수 있다.

여기서 양수는 우리가 생각하는 이진법 계산을 그대로 하여 10진법으로 변경하면 되지만,

음수는  - ( 수를 반전 후 + 1을 하여 계산한 값 ) 이 10진법으로 변환한 값이다.

따라서 위의 byte를 int로 바꾼다면 byte의 -128 ~ 127 범위를 컴퓨터는 이진수로 다음과 같이 표현이 될 것이다.

11111111111111111111111110000000 ~ 00000000000000000000000001111111

System.out.println(Integer.toBinaryString(-128)); //11111111111111111111111110000000
System.out.println(Integer.toBinaryString(127)); //1111111

 

 

또한 컴퓨터에서 10진수로 변환하는 방법이 다르므로 unsigned 값과 abs 값은 다를 수 밖에 없다.

-128부터 unsigned를 계산해보면

-128(11111111111111111111111110000000) -> 128(10000000)

-127(11111111111111111111111110000001) -> 129(10000001)

...

이므로 -128 -(절댓값)-> 128

-127 -(절댓값)-> 127

...

과는 그 결과가 다른 것이다.

 

블로그 이미지

uchacha

개발자 일지

,