2진법
을 주로 사용한다.2진법
만 사용하다보면 자리 수가 길어지는 경우가 있기 때문에 8, 16진법
도 사용한다.진법 | 설명 |
---|---|
2진법 | 0과 1 2가지 기호로 표현하는 수 체계 |
8진법 | 0~7의 8가지 기호로 표현하는 수 체계 |
16진법 | 0~F의 16가지 기호로 표현하는 수 체계 |
10진법 | 2진법 | 8진법 | 16진법 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
8 | 1000 | 10 | 8 |
10 | 1010 | 12 | A |
17 | 1 0001 | 21 | 11 |
99 | 110 0011 | 143 | 63 |
보수
를 사용한다. (뺄셈 연산을 보수 처리 후, 덧셈 연산으로 한다.)1진 보수
: 해당 bit에서 가장 큰 표현값을 형성하는데 서로 보완 관계가 있는 두 수의 관계를 1진 보수
관계라고 한다.2진 보수
: 최대 표현 자리 수를 형성하는데 서로 보완 관계가 있는 두 수의 관계를 2진 보수
관계라고 한다.1진 보수
: A+B=9 일 때, (0, 8), (1, 7).. 등등이 1진 보수
관계2진 보수
: A+B=10 일 때, (0, 10), (1, 9).. 등등이 2진 보수
관계위 보수
개념을 2진법
에 적용시켜보자.
1진 보수
: A+B=1 일 때, (0, 1), (1, 0)2진 보수
: A+B=10 일 때, (1, 1), (0, 10), (10, 0) 2진법
의 1진 보수
의 경우 각 비트를 뒤집어주면 된다.2진법
의 2진 보수
의 경우 1진 보수
에 +1를 해주면 된다.2진법
정수형 수를 표현하는 방법을 알아보자.s | d | d | ... | d | d |
---|
-(2^(n-1)-1) ~ +(2^(n-1)-1)
가 된다.이 때, 2진 보수
의 개념을 이용하면 0이 2가지 방법으로 표현되는 것을 해결할 수 있다.
4개 비트를 사용한다고 하자.
0001
+ x
= 0000
을 만족하는 x
, 즉 -1
을 구하고자 할 때, 2진 보수
를 활용하면 된다.
2진 보수
를 구하기 위해선 1진 보수
를 구하고 +1 해주면 되므로 1진 보수
를 먼저 구해보자.
1진 보수
는 모든 비트 값을 뒤집어주면 되므로 1110
가 된다.
따라서 0001
의 2진 보수
x
는 1111
가 되고, 이것이 -1
이다.
위와 같이 음수를 표현해주면 앞서 말한 0이 2가지 방법으로 표현되는 것을 해결할 수 있다.
더불어 수의 표현 범위는 -(2^(n-1)) ~ +(2^(n-1)-1)
가 된다.
2진법
정수형 데이터를 일일히 10진법
으로 변환하는 작업이 번거로워서 10진법
정수형 형태로 저장하는 경우도 있다.1 바이트로 10진법
하나 자릿수만 표현한다.
따라서, 비트는 아래처럼 형성된다.
F D | F D | ... | F D | F D | S D |
---|
(F: 1111, D: 11XX, S: 1100(+), 1101(-))
1 바이트로 10진법
의 한자리 수를 표현하니 비트가 남는다. 따라서 F로 마지막 바이트를 제외하고 모든 바이트의 앞 비트로 채워준다.
D 비트로 수를 표현하는데, 이 또한 10까지 표현하는데 2개의 비트만 사용하면 되므로 D 비트는 11XX 형태가 될 것이다.
S 비트는 부호를 표현하는 비트다.
1 바이트에 10진법
두 자리수를 표현한다. (BCD code 이용, BCD 코드는 밑에서 다룰 예정!)
D D | D D | ... | D D | D D | D S |
---|
(D: 11XX, S: 1100(+), 1101(-))
32비트 실수형의 경우
31 | 30 | 29 | ... | 23 | 22 | 21 | ... | 0 |
---|---|---|---|---|---|---|---|---|
s | e | e | ... | e | m | m | ... | m |
64비트 실수형의 경우
63 | 62 | 61 | ... | 52 | 51 | 50 | ... | 0 |
---|---|---|---|---|---|---|---|---|
s | e | e | ... | e | m | m | ... | m |
예를 들어 알아보자.
10진수
5.625
를 실수형으로 표현해보자.
먼저, 2진수
고정 소수점 표현 방식으로 바꿔보면 101.101
이 된다. 그 과정을 살펴보자.
정수부는 101
이 되는 건 생략하고, 소수점을 이진수
로 표현할 때는 *2
연산을 했을 때, 정수부가 1이 되면 1을, 아니면 0을 채워나가면 된다.
101
이 2진수
의 실수부가 된다.
이제 고정 소수점 표현 방식의 2진수
인 101.101
을 지수형으로 바꿔주면 1.01101 * 2^2
가 된다.
가수부는 1.01101
에서 소수점 앞 1은 당연한거기 때문에 저장을 안하고 소수점 뒤의 01101
부분만 저장한다.
이제 지수부 2
를 저장해야하는데, 지수부도 양/음 값을 판별해줘야 한다. (10진수
값이 1보다 작다면 음의 값을 갖기 때문)
이 때, 32비트 실수형이면 8비트로 지수부를 표현하고, 음/양을 구별하기 위해 바이어스값 127(2^7 - 1)을 더해준다. (만약 64비트 실수형이라면 11비트로 지수부를 포현하고 이 때 바이어스값은 1023이 된다.)
즉, 지수부 8비트가 127이면 0, 128이면 1을 뜻하게 된다. 따라서 위 예에서는 지수부가 2
이기 떄문에 129, 1000 0001
가 된다.
정리하면 10진수
101.101
은 0 | 1000 0001 | 011 0100 0000 0000 0000 0000
이 된다.
부호 | 지수부 | 가수부 |
---|---|---|
0 | 1000 0001 | 011 0100 0000 0000 0000 0000 |
10진수 | BCD 코드 | 10진수 | BCD 코드 |
---|---|---|---|
0 | 0000 | 10 | 0001 0000 |
1 | 0001 | 11 | 0001 0001 |
2 | 0010 | 12 | 0001 0010 |
3 | 0011 | 13 | 0001 0011 |
4 | 0100 | 14 | 0001 0100 |
5 | 0101 | 15 | 0001 0101 |
6 | 0110 | 16 | 0001 0110 |
7 | 0111 | 17 | 0001 0111 |
8 | 1000 | 18 | 0001 1000 |
9 | 1001 | 19 | 0001 1001 |
10진수 | BCD 코드 | 3초과 코드 |
---|---|---|
0 | 0000 | 0011 |
1 | 0001 | 0100 |
2 | 0010 | 0101 |
3 | 0011 | 0110 |
4 | 0100 | 0111 |
5 | 0101 | 1000 |
6 | 0110 | 1001 |
7 | 0111 | 1010 |
8 | 1000 | 1011 |
9 | 1001 | 1100 |