2. 2, 8, 16진수
디지털 시스템에서는 일상에서 사용하는 10진수가 아닌 2, 8, 16진수을 사용한다.
(왼쪽: 10진수, 오른쪽: 2, 8, 16진수)
10진수(decimal)는 일상에서 사용하는 수이고 각 자릿수(digits)는 0~9이며 가중치(weight)는 10이다. 예를 들어 \(73.35=7\times10^{1}+3\times10^{0}+3\times10^{-1}+5\times10^{-2}\)이다. 더이상의 설명은 하지 않겠다.
2진수
한 자리에 두가지의 수 0, 1로만 구성된 수 체계를 2진수라고 하고, 2진수의 한 자리를 비트(bit)라고 한다. 2진수에서 가장 오른쪽의 비트를 최하위 비트(least significant bit, LSB), 가장 왼쪽의 비트를 최상위 비트(most significant bit, MSB)라고 하고, 각 자릿수는 0 또는 1이며 가중치는 2이다.
2진수의 예: \(1010.11_{2}=1\times2^{3}+0\times2^{2}+1\times2^{1}+0\times2^{0}+1\times2^{-1}+1\times2^{-2}=26.75_{10}\)
다음은 10진수를 2진수로 나타내는 과정이다.
2진수로 변환하고자 하는 10진수를 나머지가 0이 될 때 까지 2로 나누어서 그 나머지를 순서대로 오른쪽에서 왼쪽으로 기록한다. 맨 처음에 나온 나머지는 LSB이고, 마지막에 나온 나머지가 MSB이다.
다음은 10진 소수를 2진수로 나타내는 과정이다.
2진수로 변환하고자 하는 10진 소수를 2로 곱해서 1 이상의 값이 나오면 1의 자리를 버리고 남은 소수에 2를 곱해서 해당 소수의 소수부가 완전히 0이 될 때 까지 1의 자리에 나타나는 수를 왼쪽에서 오른쪽으로 기록한다. 맨 처음에 나온 1의 자리수가 MSB이고 맨 마지막에 나온 1의 자리수가 LSB이다.
다음은 2진수의 덧셈, 뺄셈, 곱셈이다.
2진수의 덧셈에서 발생하는 자리올림수를 캐리(carry)라고 한다. 예를 들어
\(011_{2}+001_{2}=100_{2},\,101_{2}-011_{2}=010_{2},\,11_{2}\times11_{2}=1001_{2},\,111_{2}\times101_{2}=1001_{2}\)이다.
2진수의 나눗셈은 10진수의 나눗셈 방법과 동일하다. 예를들어
\(110_{2}\div11_{2}=10_{2},\,110_{2}\div10_{2}=11_{2}\)이다.
2진수의 1의 보수(complement)는 2진수에서 1을 0으로, 0을 1로 바꾸어서 구한다.
예를들어 \(10110010_{2}\)의 2의 보수는 \(01001101_{2}\)이다.
2진수의 2의 보수는 1의 보수에 1을 더한 것이다.
위의 그림에서 \(10101010_{2}\)의 1의 보수가 \(01010101_{2}\)이고 여기에 1을 더한 값인 \(01010110_{2}\)이 2의 보수이다.
또는 원래의 2진수에서 가장 우측 LSB부터 시작해서 첫번째 1인 비트까지는 그대로 두고, 나머지 비트에 대해서 1의 보수를 취한다.
예를 들어 \(1000100_{2}\)의 2의 보수를 이 방법대로 구하면 LSB에서 첫번째 1이 나올 때 까지는 그대로(100)이고, 그 첫번째 1의 오른쪽 1000에 1의 보수를 취하면 0111이므로 따라서 2의 보수는 \(0111100_{2}\)이다.
부호를 갖는 2진수에서 가장 왼쪽 비트(MSB)는 부호 비트(sign bit)로 0이면 양수, 1이면 음수이다.
8비트 2진수 \(00011001_{2}(=+25)\)의 부호 비트는 양수이므로 \(0\)이고, 크기 비트(magnitude bit)는 \(0011001_{2}(=25)\)이다. 반대로 \(10011001_{2}(=-25)\)의 부호 비트는 음수이므로 \(1\)이고, 크기 비트는 \(0011001_{2}(=25)\)이다.
부호를 갖는 2진수에 1의 보수를 취했을 때 양수는 일반적인 방법으로 하면 되고, 음수의 경우는 부호 비트를 제외한 크기 비트에 대해 1의 보수를 취한다. 예를들어 2진수 \(-25\)는 양수 \(+25\)의 2진수 표현 \(00011001_{2}\)의 1의 보수 \(11100110_{2}\)이다.
2의 보수의 경우도 양수는 일반적인 방법으로 하면 되고, 음수의 경우는 부호 비트를 제외한 크기 비트에 대해 2의 보수를 취하면 된다. 예를들어 2진수 \(-25\)는 양수 \(+25\)의 2진수 표현 \(00011001_{2}\)의 2의 보수 \(11100110\)이다.
*컴퓨터 시스템에서 2의 보수 표현을 사용한다.
부호를 갖는 2진수의 비트 수는 한정되어 있다. n비트로 표시 가능한 2진수의 최대 개수는 \(2^{n}\)개(\(0\)부터 \(2^{n}-1\)까지)이고 n번째 비트는 부호 비트, n-1번째 이하의 비트는 크기 비트 이므로
부호 및 크기의 표현범위는 \(-(2^{n-1}-1)\,\sim\,(2^{n-1}-1)\)
1의 보수 표현범위는 \(-(2^{n-1}-1)\,\sim\,(2^{n-1}-1)\)
2의 보수 표현범위는 \(-2^{n-1}\,\sim\,(2^{n-1}-1)\)
이다.
매우 큰 정수를 표현하기 위해서는 많은 비트가 필요하다. 부동 소수점 수(floating-point number)를 사용하면 비트 수를 늘리지 않고 매우 크거나 작은 수를 표현할 수 있으며 정수와 소수를 갖는 수도 표현할 수 있다. 수의 크기를 나타내는 부분을 가수(mantissa), 자릿수를 나타내는 부분을 지수(exponent)라고 한다.
단일정도(single-precision) 부동 소수점 수는 32비트(4바이트)로, 배정도(double-precision) 부동 소수점 수는 64비트(8바이트)로, 확장정도(extended-precision) 부동 소수점 수는 80비트(10바이트)로 표현된다. 이 세가지는 비트 수만 다르고 기본적인 형식은 모두 같다. 여기서는 단일정도 부동 소수점에 대해서만 다룰 것이다.
단일정도 부동 소수점 수는 다음과 같이 나타내어진다.
E는 지수로 실제 지수 값에 \(127(=2^{7}-1)\)을 더한 편중지수(biased exponent)로 표현하는데 이는 지수에 별도의 부호를 사용하지 않게 하기 위해서이다(-126~128까지의 실제 지수를 표현 가능하다).
2진수 \(1011010010001_{2}\)를 부동소수점으로 나타내면 \(1.011010010001\times2^{12}_{2}\)이며 양수이므로 MSB는 0, 지수는 12이므로 127을 더한 편중지수 129(=\(10001011_{2}\))가 지수부분이며, 소수부분이 0.011010010001이므로 \(011010010001_{2}\)가 가수부분이고 나머지 비트는 0으로 채운다.(아래 그림 참고)
*부동소수점 수의 2진수는 \((-1)^{S}(1+F)2^{E-127}\)이다(S는 부호, E는 지수, F는 소수).
부호를 갖는 수의 산술연산
다음은 부호를 갖는 이진수의 덧셈이고 음수의 경우 2의 보수로 나타내어 더한다.
이 과정에서 발생하는 캐리(자리올림)는 무시한다. 이때 표현 가능한 자리수가 한정되어있기 때문에 표현가능한 자리수를 초과하는 경우(오버플로우, overflow)가 발생한다. 이 경우는 양수+양수의 경우와 음수+음수의 경우에 발생한다.
위의 그림은 8비트의 두 양수를 더해서 오버플로우가 발생한 것이고 합의 크기가 127을 초과했기 때문이다.
여러 개의 2진수를 더하는 경우, 2개씩만 차례로 연속적으로 더한다.
다음은 부호를 갖는 2진수의 뺄셈이고 감수를 2의 보수로 나타내어 피감수에 더한다.
이 과정에서 발생하는 캐리(자리올림)는 무시한다.
다음은 부호를 갖는 2진수 \(01001101_{2}\)와 \(00000100_{2}\)의 곱셈이고 부호가 같으면 +, 다르면 -이다.
2진수의 곱셈은 피승수를 승수번 더하는 방식으로 구한다.
다음은 부호를 갖는 2진수 \(01100100_{2}\)를 \(00011001_{2}\)로 나누는 과정이고 부호가 같으면 +, 다르면 -이다.
2진수의 나눗셈은 피제수를 제수번 빼는 방식(2의 보수화 하여 더함)으로 구한다.
16진수
16진수는 가중치가 16이고, 각 자릿수가 0~9, A, B, C, D, E ,F이다.
(10진수, 2진수, 16진수)
\(2^{4}=16\)이므로 2진수의 4자리는 16진수 1자리이다.
위의 그림은 2진수와 16진수의 관계를 나타낸 것이다.
다음과 같이 16진수의 수를 10진수의 수로 나타낼 수 있다.
다음은 10진수를 16진수로 변환하는 과정이다.
16진수로 변환하고자 하는 10진수를 1의 자릿수가 0이 될 때 까지 16으로 나누어서 발생하는 소수부분에 16을 곱하고 그 수들을 오른쪽에서 왼쪽으로 기록한다. 맨 처음으로 나오는 수가 LSB이고, 마지막으로 나오는 수가 MSB이다.
16진수의 덧셈:
16진수의 뺄셈: 2진수로 변환한 다음, 제수를 2의 보수화 하여 피제수와 더하고 이때 발생하는 캐리는 무시한다.
8진수
8진수는 가중치가 8이고, 자릿수가 0~7이다.
\(2^{3}=8\)이므로 2진수의 3자리는 8진수의 1자리이다.
위의 그림은 2진수와 8진수의 관계를 나타낸 것이다.
다음과 같이 8진수의 수를 10진수의 수로 나타낼 수 있다.
10진수를 8진수로 변환하는 과정:
16진법의 경우처럼 8진수로 변환하고자 하는 10진수를 1의 자릿수가 0이 될 때 까지 8로 나누어서 발생하는 소수부분에 8을 곱하고 그 수들을 오른쪽에서 왼쪽으로 기록한다. 맨 처음으로 나오는 수가 LSB이고, 마지막으로 나오는 수가 MSB이다.
참고자료:
Digital Fundamentals 11th edition, Floyd, Pearson
Digital Design 4th edition, Mano, Ciletti, Pearson
'전자공학 > 디지털논리회로' 카테고리의 다른 글
6. 조합논리 (0) | 2019.04.08 |
---|---|
5. 불 대수, 카르노 맵 (0) | 2019.04.07 |
4. 논리 게이트 (2) | 2019.04.06 |
3. BCD, 디지털 코드, 패리티 방법 (0) | 2019.04.05 |
1. 디지털의 개념, 집적회로(IC)의 종류 (0) | 2019.04.03 |