지난번 글에서는 CPU의 작동원리에 대하여 알아보았습니다. MOSFET에 전압을 주거나 주지 않는 것으로 전류 흐름을 제어했습니다. 이번 글에서는 컴퓨터가 데이터를 인식하는 원리를 알아보도록 하겠습니다.
1. 정보의 단위
컴퓨터는 MOSFET을 통해 전류가 흐르거나 흐르지 않는 상태를 인식할 수 있습니다. 전류가 흐르면 1, 전류가 흐르지 않는다면 0으로 나타낼 수 있는데, 이렇게 0과 1을 표현하는 가장 작은 정보 단위를 비트(bit)라고 합니다.
1비트를 통해서는 2가지 정보를 알 수 있으며, 2비트로는 (0, 0), (0, 1), (1, 0), (1, 1) 이렇게 4가지 정보를 알 수 있습니다. n비트를 통해서는 2n가지 정보를 표현할 수 있습니다.
프로그램은 수많은 비트로 이루어져 있어서 비트 단위로 데이터를 나타내기 힘들기 때문에, 데이터는 8개의 비트를 묶어 바이트(byte)를 정보의 기본단위로 사용합니다. 즉, 1byte는 8bit에 해당하며, 28 = 256가지의 정보를 나타낼 수 있습니다. 보통 1byte로는 하나의 문자를 나타낼 수 있지만, 한글이나 한자 등 동양권 문자의 경우 1byte로 나타낼 수 없어서 하나의 문자당 2byte를 사용합니다.
8bit가 모여 1byte가 된 것처럼, byte는 1000개씩 묶어 더 큰 단위를 나타낼 수 있습니다.
단위 |
정의 |
비트(bit) |
0, 1 |
바이트(Byte) |
8 bit |
킬로바이트(KB) |
1000 Byte |
메가바이트(MB) |
1000 KB |
기가바이트(GB) |
1000 MB |
테라바이트(TB) |
1000 GB |
페타바이트(PB) |
1000 TB |
이 외에도 CPU가 한 번에 처리할 수 있는 정보의 단위는 워드(word)로 나타냅니다.
2. 이진법
컴퓨터는 0과 1을 사용하는 2진법(binary)을 통해 데이터를 이해합니다. 2진법은 자릿값이 올라감에 따라 그 크기가 2배씩 커지게 되므로 2진법을 십진법으로 바꾸기 위해서는 자릿수마다 2n을 곱한 값을 모두 더하면 됩니다.
예를 들어 이진수 0b1101을 십진수로 나타내면 다음과 같습니다.
0b1101 = 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20 = 8 + 4 + 0 + 1 = 13 |
컴퓨터가 이진수로 음수를 표현하는 방법은 3가지가 있습니다.
1) 부호 비트와 절댓값 방법
2진법으로 수를 표현할 때, 가장 왼쪽에 있는 비트의 값을 최상위 비트(Most Significant Bit, MSB)라고 합니다. 부호 비트와 절댓값 방법은 최상위 비트를 이용하여 음수를 표현합니다.
예를 정수 13의 경우 다음과 같이 2진법으로 나타낼 수 있습니다.(보통 정수 자료형은 4byte의 크기를 가집니다.)
0000 0000 0000 0000 0000 0000 0000 1101 |
이를 -13으로 나타내기 위해서는 최상위 비트를 1로 바꾸면 됩니다.
1000 0000 0000 0000 0000 0000 0000 1101 |
이 방법을 사용하면 1비트가 부호를 표현하기 위해 사용되어 표현할 수 있는 절대값의 범위는 절반으로 줄어들게 됩니다. (0 ~ 216 - 1)
또한 +0과 -0이 따로 존재하게 됩니다.
2) 1의 보수법
1의 보수법은 비트를 반전시켜 음수를 표현하는 방법입니다. 이 방법을 사용하면 비트의 NOT 연산만으로도 음수를 표현할 수 있어서 연산이 간단해집니다.
예를 들어 13을 음수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 0010 |
1의 보수법을 통해 연산을 하는 데 있어서 캐리(carry)가 중요합니다. 캐리는 상태 레지스터의 플래그를 설명할 때 언급한 적이 있는데, 올림수나 빌림수 여부를 나타냅니다.
예를 들어 13 - 5 를 계산해보겠습니다.
13을 이진수로 나타내면 다음과 같습니다.
0000 0000 0000 0000 0000 0000 0000 1101 |
-5를 1의 보수법을 통해 이진수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 1010 |
두 수를 더하면 다음과 같이 캐리가 생깁니다.
1 0000 0000 0000 0000 0000 0000 0000 0111 |
캐리를 최하위 비트에 더해주면 결과값이 됩니다.
해당 2진수는 10진수로 나타내면 8이 되며, 이는 13 - 5와 동일한 결과입니다.
이번에는 5 - 13 을 계산해보겠습니다.
5를 2진수로 나타내면 다음과 같습니다.
0000 0000 0000 0000 0000 0000 0000 0101 |
-13을 1의 보수법을 통해 이진수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 0010 |
두 수를 더하면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 0111 |
해당 결과는 캐리가 없습니다. 이 경우 결과값을 다시 1의 보수법으로 나타내면 최종 결과값이 됩니다. 부호는 마이너스(-) 입니다.
0000 0000 0000 0000 0000 0000 0000 1000 |
1의 보수법은 부호 비트와 절댓값 방법과 마찬가지로 +0과 -0이 따로 존재한다는 문제점이 있습니다.
3) 2의 보수법 2의 보수법은 1의 보수법을 통해 표현한 값에 1을 더하여 음수를 표현하는 방법입니다.
예를 들어 13을 음수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 0011 |
2의 보수법을 통해 연산을 하는 데 있어서 1의 보수법과 달리 캐리가 발생하면 캐리를 버립니다.예를 들어 13 - 5 를 계산해보겠습니다.
13을 이진수로 나타내면 다음과 같습니다.
0000 0000 0000 0000 0000 0000 0000 1101 |
-5를 2의 보수법을 통해 이진수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 1011 |
두 수를 더하면 다음과 같이 캐리가 생깁니다. 1 0000 0000 0000 0000 0000 0000 0000 1000 |
1의 보수법과 달리 캐리를 버린 값이 최종 결과값이 됩니다.
0000 0000 0000 0000 0000 0000 0000 1000 |
이번에는 5 - 13 을 계산해보겠습니다.
5를 2진수로 나타내면 다음과 같습니다.
0000 0000 0000 0000 0000 0000 0000 0101 |
-13을 2의 보수법을 통해 이진수로 나타내면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 0011 |
두수를 더하면 다음과 같습니다.
1111 1111 1111 1111 1111 1111 1111 1000 |
해당 결과는 캐리가 없습니다. 이 경우 결과값을 다시 2의 보수법으로 나타내면 최종 결과값이 됩니다. 부호는 마이너스(-) 입니다.
0000 0000 0000 0000 0000 0000 0000 1000 |
이 방법을 사용하면 -0은 2의 보수를 구하는 과정에서 최상위 비트를 초과한 오버플로우가 발생하여 +0이 됩니다. 그러므로 2의 보수법에서는 하나의 0만 존재하게 됩니다. 때문에 현재 대부분의 시스템에서는 2의 보수법을 사용하여 음수를 표현합니다.
|