이진법은 왜 알아야 하는가
컴퓨터는 0과 1 (신호의 있고 없음)만을 이해할 수 있습니다.
- 이 0과 1을 표현할 수 있는 가장 작은 정보의 단위를 '비트(Bit)'라고 합니다.
- n개의 비트를 가지고 표현할 수 있는 경우의 수(상태)는 2^n 개 입니다.
- 2000년대 이후 다루는 비트의 수는 아주아주 커졌다. 그래서 Mega, Giga, Tera 등의 수량 접두어를 사용하여 단축하여 표현합니다.
- Kilo = 10^3, Mega = 10^6, Giga = 10^9, Tera = 10^12 등으로, 미국 접두어는 10^3 배만큼 증가합니다.
- 워드(Word)는 CPU가 한번에 처리할 수 있는 데이터 크기를 말합니다. 이에 접두어를 붙여 하프 워드, 풀 워드, 더블 워드의 0.5배, 1배, 2배를 뜻하는 용어를 사용하기도 합니다. 이러한 워드는 아키텍처에 따라 달라지며, 현행 Intel, AMD 사의 CPU 아키텍처는 64비트를 사용하고 있으므로 이들의 풀 워드는 64비트가 됩니다.
- 사람은 보통 십진수를 사용하기 때문에 이진수인지 십진수인지 16진수인지 알려주지 않으면 모를 수 있습니다.
- 따라서 이러한 혼동이 발생할 수 있을 때는 이진수는 0b 를 접두어처럼 붙여서 표현합니다.
- b는 Binary를 뜻합니다.
- 16진수는 접두어로 0x를 붙입니다.
- x는 heXadecimal 이라고 보시면 됩니다.
- 따라서 이러한 혼동이 발생할 수 있을 때는 이진수는 0b 를 접두어처럼 붙여서 표현합니다.
- 음수에 대한 표현은 여러 접근이 있었으나 가장 효율적인 방법을 주로 사용합니다.
- 그 방법은 2의 보수(two's complement)를 구해서 그 값을 음수로 간주하는 것 입니다.
- 2의 보수는 절대값이 같은 양수인 이진수의 0과 1을 모두 뒤집고 1을 더한 값입니다,
- 보수는 자릿수가 하나 올라갈 수 있게 보충해 줄 수 있는 수를 말합니다.
- 이진수에서는 양수의 보수를 구한다면, 해당 양수의 모든 자리의 0, 1을 뒤집어주고 1을 더하면 됩니다.
- 1을 더하지 않은 경우를 더해보면 모든 자릿수가 1이 되는 값이 됩니다. 여기에 1을 더하면 자릿수가 하나 올라가고 올라간 자릿수보다 작은 자릿수의 수들은 모두 0이 됩니다.
- 여기서 올라간 자릿수를 '캐리(Carry)'라고 합니다.
- 1의 보수, 2의 보수 등 여러 방법에서 2의 보수가 대세가 된 이유를 잘 설명하신 글이 있어 링크를 첨부합니다. https://st-lab.tistory.com/189
- 2의 보수를 음수로 간주하는 경우에 그 값을 양수와 구분하기 어렵습니다.
- 따라서 컴퓨터는 플래그를 사용하여, 이것이 음수인지 양수인지를 먼저 판단하도록 합니다. 이에 대한 내용은 이후 [4]ALU, CU, 레지스터에서 다루겠습니다.
- 0x0101 의 2의 보수는 0x1011 입니다. 이는 값 자체는 1+2+8로 양수 11과 같은 값입니다.
- 4비트로는 16가지의 경우의 수를 표현할 수 있는데, 0(0x0000), 1(0x0001)~7(0x0111) 7개의 양수, 0x1001(-7)~0x1111(-1) 7개의 음수를 표현합니다.
- 0x1000은 그 보수 또한 0x1000입니다. 이는 8 또는 -8 중 어떤 수를 표현하는 것인지를 정해주어야 한다는 것입니다. 대부분의 경우 음수를 택합니다.
- 16진법은 2진법과의 변환이 매우 쉽습니다.
- 2^4 = 16입니다.
- 이진수에서 십육진수로의 변환은 이진수를 네자리씩 십육진수로 변환하여 이어붙이면 변환이 완료됩니다.
- 십육진수에서 이진수로의 변환은 십육진수를 각 자리마다 4자리의 이진수로 변환하여 이어붙이면 변환이 완료됩니다.
- 그 방법은 2의 보수(two's complement)를 구해서 그 값을 음수로 간주하는 것 입니다.
이진수를 이용한 문자 표현
컴퓨터는 0 또는 1의 정보를 담고 있는 비트들로 이루어진 정보만을 처리할 수 있습니다. 그렇기 때문에 한글, 영어 등 문자는 비트 단위의 정보들로만 처리할 수 있습니다. 그렇기에 이진수로 표현되는 값들이 어떤 '문자'에 해당하는 지 정의가 되어있어야 합니다.
그래서 특정 이진수들이 어떤 각각의 문자에 해당하는지를 문자 집합(Character set)으로 만들었습니다. 문자(a, b, c ...) 등은 문자 인코딩(Character encoding)을 거쳐 각각에 맞는 비트들(0x01, 0x02 ...)로 변환되며, 반대로 문자를 나타내는 비트들은 문자집합에 정의된 내용에 따라 문자 디코딩(Character decoding) 후 문자로 변환되어 모니터에서 볼 수 있습니다. 그래서 동일한 비트들로 이루어진 데이터라도 어떤 문자 집합을 기준으로 디코딩하는지에 따라 꿿뷁쉙똵 같은 예상치 못한 문자가 나올 수 있습니다.
문자집합은 아스키(ASCII: American Standard Code for Information Interchange), EUC-KR, 유니코드(Unicode) 등 여러 종류가 존재합니다. 하지만 다행히도 유니코드가 대부분의 언어의 문자, 특수문자, 이모티콘을 표현할 수 있으며, 대부분의 국가는 유니코드 문자집합을 사용하므로 크게 걱정하지 않으셔도 됩니다.
한글을 표현하는 인코딩 방식은 조합형 인코딩과 완성형 인코딩이 있습니다. 조합형은 한글의 초성, 중성, 종성 각각을 인코딩하는 방식이고, 완성형은 초정, 중성, 종성이 합쳐진 완성된 문자를 기준으로 인코딩하는 방식입니다.
- 예전에는 EUC-KR이라는 문자집합을 꽤나 많이 썼습니다. EUC-KR은 완성형 인코딩을 지원하는 문자집합입니다.
- 2000년대의 IT 서비스들을 써보신 분들은 은(는), 이(가) 와 같이 조사를 대응하지 못한 표현을 많이 보셨었을 겁니다. 조합형 인코딩은 종성의 유무를 판단하여 조사를 대응시키면 되지만 완성형 인코딩은 모든 종성이 있는 문자들 각각에 대응을 해야 합니다. UTF-8로 인코딩되는 서비스들도 저렇게 만드는 경우가 많겠지만 요새는 조사를 명사에 대응시켜주는 방법이 많이 알려져 있습니다. (물론 문자 집합간 변환이 가능하며, 완성형 인코딩에도 대응이 가능하지만 거기에 또 품이 들겠지요.)
- JS의 한국어 조사 관련하여 참고하실 수 있는 사이트 : http://yoonbumtae.com/?p=3677
- 대부분의 국가에서도 유니코드 문자집합을 활용합니다. 유니코드를 사용하는 것이 다국어 지원을 위한 서비스를 만들 때 훨씬 유리하기 때문입니다.