본문 바로가기
컴퓨터구조&운영체제

[혼공컴운] Ch02. 데이터

by dev_writer 2023. 12. 26.

0과 1로 숫자를 표현하는 방법

 

정보 단위

먼저 컴퓨터 안에서 흘러가는 데이터에 대해 알기 위해서는, 컴퓨터가 어떤 단위로 정보를 사용하는지 알아야 합니다.

 

컴퓨터에서는 가장 작은 정보 단위로 비트 (bit)를 가지고 있습니다. 비트는 쉽게 말하면 0과 1을 표현하는 가장 작은 정보 단위입니다.

 

1 비트가 0과 1을 표현할 수 있으니, n비트는 2^n 가지의 정보를 표현할 수 있음을 이끌어 낼 수 있습니다.

 

프로그램은 수많은 비트로 이루어져 있으나, 프로그램의 크기를 말할 때는 비트보다 더 큰 단위 (바이트, 킬로바이트, 메가바이트, 기가바이트..)를 사용합니다.

1바이트 (1byte) 8비트 (8bit)
1킬로바이트 (1kB) 1,000 바이트 (1,000 byte)
1메가바이트 (1MB) 1,000 킬로바이트 (1,000 kB)
1기가바이트 (1GB) 1,000 메가바이트 (1,000 MB)
1테라바이트 (1TB) 1,000 기가바이트 (1,000 GB)

 

그런데 이 부분에서 의문을 가지실 수도 있습니다. 어떤 분들은 비트, 바이트, 킬로바이트 등으로 변환될 때 1024 (2^10) 배 씩 증가된다고 알고 계셨을 것입니다. 하지만 올바른 계산법은 1,000 배 씩입니다.

 

이는 국제단위 시스템인 SI (International System of Unit)에서 K, M, G는 10의 제곱으로 인정하기 때문입니다.

 

실제 컴퓨터에서는 1,024배씩 증가되기에, 이들 간의 혼란을 방지하고자 이진 접두어 i를 붙여 KiB, MiB, GiB, TiB와 같은 형식으로 구별해 놓았습니다.

 

워드 (word)

워드는 비트보다 조금 더 큰, CPU가 한 번에 처리할 수 있는 정보의 크기 단위를 뜻합니다.

  • 하프 워드 (half word)는 워드의 절반 크기를 뜻합니다.
  • 풀 워드 (full word)는 워드의 크기를 뜻합니다.
  • 더블 워드 (double word)는 워드의 두 배 크기를 뜻합니다.

현대 컴퓨터의 워드 크기는 대부분 32비트 또는 64비트입니다. 보통 윈도우에서 32비트, 64비트 프로그램을 보셨던 적이 있으셨을 것입니다.

 

이진법

컴퓨터는 0과 1만을 이해합니다. 예시로 숫자 8은 1000으로 표현될 수 있습니다. 2^3 * 1 + 2^2 * 0 + 2^1 * 0 + 2^0 * 0처럼 맨 끝에서부터 2의 제곱을 증가시킨 값들을 더하는 방식이라고 생각하시면 됩니다.

 

숫자가 1을 넘어가는 시점에 자리올림이 되며, 우리가 일상적으로 사용하는 진법 (십진법)은 숫자가 9를 넘어갈 때 자리올림을 합니다.

 

그런데 앞선 예시에서 1000은 이진수로 8을 의미하는지, 아니면 진짜 1000을 의미하는지 구분하기 헷갈릴 수도 있습니다. 이를 방지하기 위해 이진수를 나타낼 경우 1000_{(2)}와 같이 표현하며, 코드 상에서 표기할 때는 앞에 0b를 붙여 0b1000 처럼 표시합니다.

 

이진법의 음수 표현

이진법으로 음수도 표현할 수 있는데, 이 때는 2의 보수를 활용하여 음수를 표현합니다.

  • 어떤 수를 그보다 큰 2^n에서 뺀 값을 2의 보수라 합니다. 예시로 숫자 3을 이진법으로 표기한 11을 그보다 큰 숫자 4, 즉 100에서 뺄 경우 01이 됩니다.
  • 간단히 계산하려면 모든 0과 1을 뒤집고 1 더한 값을 활용하면 됩니다. (11 - 00 - 01)

그런데 이 점 때문에, 이진수를 봤을 때 이 수가 음수로 표현된 값인지 양수로 표현된 값인지 구분하기 힘들 수 있습니다. 이럴 때는 플래그를 활용하여 표현합니다. 간단히 말씀드리면, 플래그가 세워져 있는지 세워져있지 않은지에 따라 CPU가 양수인지 음수인지를 구별시킬 수 있습니다.

 

2의 보수의 한계

위에서 2의 보수를 이용해 이진수의 음수를 표현할 수 있다고는 하지만, 한계점이 존재합니다. 바로 0이나 2^n으로 이루어진 수에 대해서는 2의 보수를 취하면 원하는 값을 얻을 수 없다는 것입니다.

  • 0일 경우 기존 0000을 모든 0과 1을 뒤집을 시 1111이 되며, 1을 더하면 10000이 됩니다.
    • 다만 이것은 자리 올림이 발생한 비트의 1을 버림으로써 해결 가능합니다.
  • 2^n의 수일 경우 (ex: 8), 기존 1000에서 모든 0과 1을 뒤집으면 0111이 되고, 이때 1을 더하면 1000으로 기존값과 같습니다.

 

십육진법

이진법으로 표현할 경우, 간단한 수일 때에도 숫자의 길이가 너무 길어지는 경우가 있습니다. 대표적인 예로 숫자 32는 100000과 같이 여섯 개의 자릿수가 필요합니다.

 

이를 단축시키기 위한 방법으로 십육진법이 논의되었습니다. 십육진법은 숫자가 15를 넘을 때 자리 올림이 되는 방법입니다. 10 ~ 15는 A ~ F로 표현됩니다.

 

이진법 때와 마찬가지로 숫자 뒤에 아래첨자 (16)을 붙이거나, 코드에서는 0x를 앞에 붙입니다.

 

십육진수에서 이진수로 변환

십육진수와 이진수의 변환은 십진수와 이진수의 변환보다 쉽습니다.

 

2^4 = 16이므로, 하나의 십육진수는 네 개의 이진수를 표현한다고 생각하시면 됩니다.

 

예시로 십육진수 1A2B는 각각 1 = 0001, A = 1010, 2 = 0010, B = 1011 이진수로 치환되어, 0001101000101011이라는 값으로 대체됩니다.

 

이진수에서 십육진수로 변환

이진수에서 십육진수를 변환할 때도 이진수 네 개당 하나의 십육진수가 나온다고 생각하면 됩니다.

 

예시로 이진수 11010101은 1101 = D, 0101 = 5로 치환되어 D5라는 십육진수가 나옵니다.


0과 1로 문자를 표현하는 방법

컴퓨터가 이해할 수 있는 수는 0과 1 뿐이기에, 어떻게 문자를 표현할 수 있는 것인지 궁금하실 수 있습니다.

 

요약하자면, 특정 문자의 값을 숫자로 치환한 값을 이용해서 컴퓨터에게 알려줄 수 있습니다.

 

문자 집합과 인코딩

문자 집합컴퓨터가 인식하고 표현할 수 있는 문자의 모음을 뜻합니다. 문자를 0과 1로 변환하는 과정을 문자 인코딩 (encoding), 0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정을 문자 디코딩 (decoding)이라 합니다.

 

아스키코드

아스키코드 (ASCII)는 초창기 문자 집합 중 하나로, 이곳을 확인하시면 아스키코드표를 보실 수 있습니다.

 

각각 7비트로 표현되며, 그렇기에 표현할 수 있는 정보의 가짓수는 2^7 = 128가지가 됩니다.

 

인코딩 과정이 간단했지만, 한글을 포함한 다른 언어 문자, 다양한 특수 문자 등은 표현이 불가능했습니다. 8비트로 늘렸으나 (8비트 확장 아스키) 여전히 부족함이 있었습니다.

 

한글 인코딩: 완성형 vs 조합형 인코딩

한글은 아스키코드로 표현할 수 없기에 다른 인코딩 방식이 필요합니다. 이때 완성형 인코딩으로 할지 (ex: "가", "나" 등 하나의 단어에 대해 인코딩을 하는 방식), 조합형 인코딩으로 할지 (ex: "ㄱ", "ㄴ" 등 하나의 한글에 대해 인코딩을 하는 방식) 나뉘게 됩니다.

 

EUC-KR

  • KS X 1001, KS X 1003 문자집합 기반의 한글 인코딩 방식입니다.
  • 완성형 인코딩 방식입니다.
  • 글자 하나당 2바이트 크기의 코드를 부여합니다.
    • 2바이트 = 16비트이기 때문에, 4자리 십육진수를 표현할 수 있습니다.
  • 2,300여 개의 한글을 표현할 수 있으나, 여전히 모든 한글을 표현하기에는 부족했습니다.
  • 언어별로 인코딩을 하게 되면 다국어 지원 프로그램 개발 시 매우 복잡해집니다.

 

유니코드 문자 집합과 utf-8

위에 있는 완성형 인코딩은 표현할 수 있는 가짓수가 적고, 언어마다 다르다는 단점이 있기에 이를 통일하고자 하였습니다. 그렇게 해서 나온 것이 유니코드 (unicode)이며, 통일된 문자 집합을 가집니다. 한글, 영어, 화살표와 같은 특수 기호까지 표현할 수 있으며, 현대 문자 표현에 있어 매우 중요한 위치입니다.

 

유니코드를 인코딩할 때는 글자 값 자체를 인코딩으로 하지 않고, UTF-8, UTF-16 등 다양한 방식을 사용합니다.

 

Reference