진법(number system)이란 수를 세는 방법 또는 단위를 의미한다.
진법은 보통 (r-1) 형식으로 표현하는데 r에 진수를 대입하면 2진수는 1, 8진수는 7, 10진수는 9, 16진수는 F까지 표현한다는 뜻이다.
10진법 | 2진법 | 8진법 | 16진법 |
0 | 0000 | 0 | 0 |
1 | 0001 | 1 | 1 |
2 | 0010 | 2 | 2 |
3 | 0011 | 3 | 3 |
4 | 0100 | 4 | 4 |
5 | 0101 | 5 | 5 |
6 | 0110 | 6 | 6 |
7 | 0111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
18 | 10010 | 22 | 12 |
19 | 10011 | 23 | 13 |
20 | 10100 | 24 | 14 |
- 2, 8, 16진법을 10진법으로 변환하기
2진수의 경우...
예를 들어 11001을 10진수로 변환하고자 하는 경우
1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 25
소수점이 있는 101.1001을 10빈수로 변환하고자 하는 경우
1*2^2 + 0*2^1 + 1*2^0 + 1*2^-1 + 0*2^-2 + 0*2^-3 + 1*2^-4 = 5.5625
여기서 소수점 첫째 자리는 ½ 둘째 자리는 ¼ 셋째 자리는 ⅛ 의 자리값을 가진다.
나머지 8진법, 16진법도 이와 동일한 방법으로 10진수로 변환한다.
- 10진수의 r 진수로 변환
정수 부분일 경우
소수 부분일 경우
여기서 0,6을 2진법으로 표현하면 0.100101001 을 반복하게 되는데 이럴경우 반복되는 부분 직전가지의 값들만을 구하는 근사치를 구한다. 따라서 0.1001 이 된다.
r 진수 (r=2, 8, 16)간의 변환
2진수에서 8진수로 변환 하려면 먼저 2^3 이므로 3 칸씩 묶고 끝의 빈자리는 0으로 채운다. 16진수 변환의 경우 2^4 이므로 4 칸씩 묶는다. 소수점의 경우 끝자리를 묶을떄 빈칸일 경우 0으로 채운다.
ex) 이진수 1100101.10011 을 8진수와 16진수로 변환하는 경우
8진수: 001 100 101 . 100 110 = 145.46 (정수 부분을 묶을때 끝부분이 2칸 모자르므로 앞칸에 0을 2칸 추가한다.)
16진수: 0110 0101 . 1001 1000 = 65.98
- 정수 표현
정수의 범위는 무한하지만 그것을 다 표현하기에는 메모리가 무한할 수 없으므로 메모리가 허용하는 범위만큼만 정수 표현이 가능하다. 이런 정수를 표현하는 방식으로 부호 없는 정수(unsigned integer) 와 부호 있는 정수(signed integer) 가 있다.
1. 부호 없는 정수
부호 없는 정수는 + - 를 표시하는 비트가 존재하지 않는다. 즉, 음의 정수를 표현할 수 없다.
부호 없는 정수로 표현하는 과정은 주어진 수를 2진수로 변환후 2진수를 할당된 n비트에 넣는다.
이때 주어진 n비트 보다 변환된 2진수 비트의 개수가 많은경우 n비트로 표현이 불가한데 이를 오버플로(overflow)라 한다.
비트마다 표현할 수 있는 최대 정수를 구하는 방법은 다음과 같다. 2ⁿ-1
예를 들어 8비트 최대 정수는 255이므로 256일시 오버플로가 발생한다. 결국 이를 해결하기 위해서는 9 이상의 비트로 표현해야 한다.
2. 부호 있는 정수
부호 있는 정수는 - + 부호 표현이 가능하며 표현하는 방식은 최상위 1비트를 부호 비트로 사용한다. 0이면 양의 정수 1이면 음의 정수를 의미한다. 예를 들어 10진수 55를 2진수 110111 로 표현하는 경우 최상위 비트를 추가하여 0110111로 표현한다.
3. 보수란 무엇이고 어디에서 쓰이는가?
먼저 보수가 무엇인지 알아야 할 필요가 있다. 정치적 진영의 보수가 아니라 두 수의 합이 진법 n이 되게 하는 수를 말한다. 예를들어 n =10 즉 10진수면 7의 보수는 3이며 2의 보수는 8이 된다.
보수를 구하는 이유는 컴퓨터가 사칙연산을 할 때 가산(add)만 이용하기 떄문에 뺄셈을 덧셈으로 변환해야만 하기 때문이다.
즉 컴퓨터 계산할 때 A - B 는 B의 보수인 -B를 구한 다음에 계산한다. A + (-B)
4. 1의 보수
1의 보수를 구하는 예를 들면 10진수 134를 2진수로 변환하고 부호비트까지 포함한 01000110 의 보수를 구하는 방법은 1을 0으로, 0을 1로 변환한다. 따라서 10111001이 보수가 된다.
5. 2의 보수
2의 보수를 구하는 예를 들면 마찬가지로 134의 2진수 표현인 01000110을 1의 보수와 같이 변환하여 10111001인 상태에서 1을 더하여 10111010 이 된다.
6. 뺄셈의 경우
컴퓨터는 정수를 표현하기 위해서 일반적으로 2의 보수 방식을 사용한다.
위에서 설명한 바와 같이 컴퓨터는 뺄셈 연산을 보수를 구하여 A + (-B)로 계산한다.
예를들어 10진수인 24 와 17을 24 - 17 을 계산하려면 컴퓨터에서는 24의 2진수인 11000, 17의 2진수인 10001을 구하고 8비트로 표현하기 위해 0으로 8비트를 채울때까지 0을 추가하여 00011000, 00010001이 되고 B의 2의 보수를 구하여 11101111이 된다. 이 상태에서 00011000 - 11101111 를 계산하고 부호를 나타내는 최상위 비트를 무시하여 구하면 00000111 로 결과값이 나온다.
- 실수 표현
실수는 정수와는 다르게 부동소수점 방식으로 표현한다.