1. 2진법과 10진법
컴퓨터는 2진 체계로 설계되어 있다. 따라서 0과 1밖에 모르기 때문에 모든 수를 2진수로 바꾸어 저장한다.
int age = 25 // 25라는 10진수를 11001이라는 2진수로 변환해 저장
이처럼 2진법은 0과 1로만 데이터를 표현하기 때문에 10진법에 비해 많은 자리수를 필요로 한다.
2. 비트와 바이트
한 자리의 2진수를 비트(bit, binary digit)라고 하며, 1비트는 컴퓨터가 값을 저장할 수 있는 최소단위이다. 하지만 1비트는 너무 작은 단위이기떄문에 1비트 8개를 묶어서 바이트(byte)라는 단위로 정의해서 데이터의 기본단위로 사용한다
이 외에도 워드(word)가 있는데 이는 CPU가 한번에 처리할 수 있는 데이터의 크리를 말하며, 32비트 CPU에서 1워드는 32비트 이고, 64 비트 CPU에서 1워드는 64비트이다.
1비트로 2^1 = 2개, 2비트로는 2^2 = 4개, 2^3 = 8개, 4비트로는 2^4 = 16개의 값을 표현할수있다. 따라서 n비트로 2^n 개의 값을 표현할 수 있다. 그리고 n비트로 10진수를 표현한다면 표현가능한 10진수의 범위는 0 ~ 2 ^n -1 이다. (0부터 시작해야하기때문에) 즉 정리하면,
- n 비트로 표현할 수 있는 10진수
- 값의 개수 = 2^n
- 값의 범위 = 0 ~ 2^n -1
3. 8진법과 16진법
2진법으로 값을 표현하면 자리수가 길어지는 단점이 있는데 이를 보완하기 위해 8진법, 16진법을 사용한다. 2진수를 8진수로 변환하려면 2진수를 뒤에서부터 3자리씩 끊어서 그에 해당하는 8진수로 바꾸면 되고, 16진수 역시 4자리씩 끊어서 변환하면 된다.
4. 음수의 2진 표현 - 2의 보수법
n비트의 2진수로 표현할 수 있는 값의 개수는 모두 2^n 개 이므로, 4비트의 2진수로는 모두 2^4= 16개의 값을 표현할 수 있다. 즉 0 ~ 15 까지의 정수를 나타낼 수 있다.
하지만 정수가 아닌 음수를 표현하려면 어떻게 해야할까?
만약에 가장왼쪽의 첫번째 비트를 부호에 사용하면 0일때 양수, 1일떄 음수로 맨 왼쪽의 비트에 따라 부호를 알수 있다. 하지만 이 방법은 두수를 더했을때 2진수로 0이 되지않고, 0이 2개 존재, 그리고 두 값을 더할때 음수부호가 있다면 컴퓨터가 계산하기 어렵다. 따라서 등장한 방법이 2의 보수법이다.
2의 보수법
어떤 수의 ‘n의 보수’는 더했을 때 n이 되는 수를 말한다. 즉 10진법에서 7의 10의보수는 3이며, 3의 10의 보수는 7이다. 그래서 3과 7은 10의 보수의 관계에 있다고 표현한다. 그렇다면 2의 보수 관계에서는 더해서 2가 되는 두 수의 관계를 말하며, 10진법의 2는 2진법에서는 ‘10’이다. 그리고 2진수 ‘10’은 자리올림이 발생하고 0이 되는 수를 뜻한다. 결국 2의 보수관계에서는 두 2진수를 더하면 자리올림이 발생하고 0이 되어야한다.
0 1 0 1 <- 10진수로 5
+ 1 0 1 1 <- 10진수로 -5
---------------
1 0 0 0 0 <- 자리올림이 발생했으나 크기가 4비트라서 버려짐
예시에서 2진수 ‘’0101,’1011’은 서로 2의 보수관계에 있으며 두 2진수(어떤수와 어떤수의 보수)를 더하면 0이 된다. 이처럼 두 2진수로 절대값이 같고, 부호가 다른 두 10진수를 표현하는 것을 2의 보수법이라고한다.
음수를 2진수로 표현하기
- 음수의 절대값을 2진수로 변환한다.
- 1)에서 구한 2진수의 1을 0으로, 0을 1로 변환한다 (= 1의 보수 구하기)
- 2)의 결과에 1을 더한다. (2의 보수 구하는 방법 : 1의 보수 + 1)
위의 방법대로 -5를 2진수로 표현하면
-5 -> 5 -> 0101 -> 1011
더 자세히 설명하면, 먼저 -5의 절대값 5의 2진수 ‘0101’를 구한다. 그리고 이제 ‘0101’의 2의 보수를 구하면 되는데. 이때 1의 보수 구하는 방법으로 ‘1010’으로 변환한다 . 그리고 1의 더해서 2의 보수를 구하면 된다. 따라서 ‘1011’ 을 구할 수 있다.
출처 : 자바의 정석
'Java' 카테고리의 다른 글
[JAVA] 형변환(캐스팅, casting) (0) | 2023.12.17 |
---|---|
[JAVA] 기본형 변수(primitive type) (0) | 2023.12.15 |
[JAVA] 변수와 변수의 타입 (1) | 2023.12.07 |
[JAVA] TreeMap (1) | 2023.12.07 |
[JAVA] HashMap과 Hashtable (0) | 2023.12.07 |