11111111 11111111 11111111 10001110 (-114)

00000000 00000000 00000000 11111111 (0xFF)

------------------------------------- 20150831 추가



public class T

{
    public static void main(String[] args) throws Exception

    {
        byte[] b = { (byte)0x34, (byte)0x32, (byte)0x31, (byte)0x8E, (byte)0xF0 };
        System.out.println( "i:\t b[i]\t 0xff&b[i]\t toHex(0xff&b[i])" );
        for( int i=0; i<=4; i++ )

        {

            System.out.println(i + ":\t" + b[i] + "\t" + (0xFF&b[i]) + "\t" + Integer.toHexString(0xFF&b[i]));
        }
    }
}
========================================
C:\>java T
i: b[i] 0xff&b[i] toHex(0xff&b[i])
0: 52 52 34
1: 50 50 32
2: 49 49 31
3: -114 142 8e
4: -16 240 f0
========================================

1. byte & int & bit
1 byte = 8bit : -128 ~ 127, -2^(8-1) ~ 2^(8-1)-1 : 2^8개
1 int = 4 byte = 32bit : -2,147,483,648 ~ 2,147,483,647, -2^(32-1) ~ 2^(32-1)-1 : 2^32개

byte: 00000000
int: 00000000 00000000 00000000 00000000

0x34 = 00000000 00000000 00000000 00110100
(byte)0x34 = 00110100

0x32 = 00000000 00000000 00000000 00110010
(byte)0x32 = 00110010
...
0x8E = 00000000 00000000 00000000 10001110
(byte)0x8E = 10001110 (NOTE: sign bit is 1)

0xF0 = 00000000 00000000 00000000 11110000
(byte)0xF0 = 11110000 (NOTE: sign bit is 1)

2. (byte)0xF0 = 11110000 인데, 가장 좌측의 sign bit가 1이므로, 이는 음수를 뜻합니다.
byte형에 적재된 11110000의 "2의보수"는 00010000 입니다.
  11110000
+ 00010000
------------
  1 00000000  (마치, 10진수 3의 "10의보수"는 7 이듯...)

00010000 는 2^4 = 16 이므로, 결국 (byte)0xF0 = 11110000 는 -16으로 나타나게 됩니다.

3. 0xFF & b[i]
ex) 0xFF & (byte)0xF0

0xFF = 00000000 00000000 00000000 11111111 { = 32-bit = Integer }
                                           & 11110000 { = (byte)0xF0 = -16 }
        ------------------------------------
         00000000 00000000 00000000 11110000 = 0xF0 = 240 { = 32-bit = Integer }


NOTE: byte로 타입 캐스팅을 해서 출력하면 이상한 값이 들어가는 것처럼 보이는 이유는 byte도 int의 경우처럼 맨 앞의 비트를 sign bit 으로 사용하기 때문입니다. 8bit로 표현되는 0xFF 이하의 수치(0~255)에 한해서 (byte)형으로 casting하게 되면 하여 집어넣을 경우 & 0xFF 연산을 해 주게되면 32-bit 크기(int)로 unsigned byte의 값을 얻을 수 있습니다. (참고: 자바에는 primitive type 으로 unsigned 형이 없습니다.)

 

=========================================================================================================

 

자바에서 "int"형은 4byte 로 표현됩니다. 1byte는 8bit 이니 int형은 총 32 bit 로 표현됩니다.

예) int형 1의 bit 표현은 결국 다음과 같습니다.
     00000000 00000000 00000000 00000001

32bit를 이용하여 표현하니 총 표현할 수 있는 수치의 개수는 2의 32승, 즉 4,294,967,296 개가 될 것입니다.

그러나, 가장 좌측 bit 는 음수표식을 위해 사용되니(sign bit), 0을 포함하여 31bit로 표현될 수 있는 수의 개수는 2의 (32-1)승개가 됩니다. 2의 31승은 21,47,483,648 이니, 양수로 가장 큰 수는 21,47,483,648-1 입니다. 이 수는 4byte 형에서 다음과 같이 표현됩니다.
01111111 11111111 11111111 11111111 = 21,47,483,647

음수는 "2의보수"로 표현되는데,  예를 들면 int형(4byte,32bit) -1은 "2의보수"로 표현되어,

11111111 11111111 11111111 111111111 로 저장(?) 됩니다.

이는 마치 10진법 3의 10의 보수는 7, 즉
  3
+ 7
----
 10

이듯이,

  00000000 00000000 00000000 000000001
+ 11111111 11111111 11111111 111111111
--------------------------------------
1 00000000 00000000 00000000 000000000

이므로, 00000000 00000000 00000000 000000001 의 int형 "2의 보수"는
           11111111 11111111 11111111 111111111 인 것이지요.

"2의보수"를 찾는 알고리즘은 통상 NOT연산 후 +1을 취하면 됩니다. 즉,
|-1| 은 1입니다.  1은 이진수로   00000000 00000000 00000000 000000001 입니다. 
   이것에 대해 먼저 NOT연산후   11111111 11111111 11111111 111111110,
                         +1 을 취하면   11111111 11111111 11111111 111111111 입니다.

|-21,47,483,647| 은 01111111 11111111 11111111 11111111 인데,
NOT연산을 취하면  10000000 00000000 00000000 00000000 이고,
+1 을 취하면          10000000 00000000 00000000 00000001 입니다.

|-21,47,483,648| 은 10000000 00000000 00000000 00000000 인데,
NOT연산을 취하면  01111111 11111111 11111111 11111111 이고,
+1 을 취하면          10000000 00000000 00000000 00000000 입니다.

이 처럼 가장 좌측 bit 가 1 인 상태에서 2의 보수로 표현될 수 있는 가장 작은 수는 -21,47,483,648 이 됩니다.

long 형은 8 byte, 64 bit로 표현된다는 것 외엔 동일합니다.
결국, long형의 가장 큰 수는 2의 (64-1)승 -1 인, 9,223,372,036,854,775,807 까지
표현 됩니다. 음수로는 -{2의 (64-1)승} 인 -9,223,372,036,854,775,808 까지 표현되겠지요.

추가로 아래 글들을 참고하세요.

-128>>>1 = 2147483584 ??? 
http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=javatip&c=r_p&n=998318237

Re: 1>>> 32 가 1인 이유는 ???? 
http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=QandA&c=r_p&n=994003831

[자바의 숫자표현] 어디까지 가능할까 !!! 
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=920434490
 

 


[출처] 이원영, 192 Re: 자바의 자료형
http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1018155018

'language > JAVA' 카테고리의 다른 글

Decompiler jad  (0) 2010.07.22
JAVA Native Method (JNI)  (1) 2009.07.01
JNI (Java Native Interface) 란 ?  (0) 2009.06.30
블로그 이미지

란마12

,