티스토리 뷰

반응형

자바에서 byte 자료형의 범위는 -128 ~ 127 이다. 8개의 비트를 사용하니 256까지 표현하리라 착각하기 쉽다. 하지만 byte 의 맨 앞의 비트는 부호를 표현하기때문에 사실상 7개의 비트로만 수를 표현하게 된다. 간단한 예를 들어보자.

int n = 150; 
System.out.println(Integer.toBinaryString(n));	//returns 10010110  
byte b = (byte) n; 
System.out.println(b);	// returns -106

byte 자료형의 범위가 음수, 양수 모두 표현하려다보니 부득이하게 127을 넘어서는 숫자부터 음수로 인식을 하게 된다. 150이라는 int 형 숫자(=10010110)에서 보듯 맨앞의 비트가 1이므로 음수로 인식해서 -106 이라는 숫자가 리턴된다. 여기서 변함없는 것은 10010110 이라는 비트열이다. 이 byte 를 150으로 보이게 할 수 있는 방법이 없을까. 다시말해 -128~127 의 범위가 아닌 0 ~ 255 의 범위의 숫자로 표현할 수 있을까.

 

 

비트연산자 "&" 

 

결론은 아래의 결과에서 보듯이 가능하다.

int n = 150; 
System.out.println(Integer.toBinaryString(n));	//returns 10010110  

byte b = (byte) n; 
System.out.println(b);			// returns -106 
System.out.println(b & 0xff);	// returns  150

마지막 줄에 의미하는 0xff 는 표현식을 16진수로 했을 뿐이지 십진수 255, 이진수 11111111 라는 숫자일뿐이다. 아무 이진수를 가지고 이진수 11111111 과 & 비트연산자를 사용해서 연산하면 무조건 같은 값이 나올텐데 왜 저런짓을 할까.

 

11111111111111111111111110010110
00000000000000000000000011111111

--------------------------------

00000000000000000000000010010110

 

0xff(=255) 는 int 형이며 10010110 이라는 byte형은 연산전에 int 형으로 형변환되어 위와 같이 & 비트 연산을 하게 된다. int 형은 4바이트 데이터형식이며, 32자리 비트중 맨 뒤에서 8번째 비트가 1 이라고 마이너스로 인식하는 일따위는 없어지게 되는 것이다.

 

'개발/java' 카테고리의 글 목록

 

emflant.tistory.com

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함