데이터

데이터는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 포함하며, 컴퓨터와 주고받거나 컴퓨터 내부에 저장되는 정보를 의미합니다.

정보 단위

컴퓨터가 이해할 수 있는 가장 작은 정보 단위는 Bit(0 과 1 일 표현할 수 있는 가장 작은 정보단위) 입니다.

  1. n Bit 로 2 ^ n 만큼의 정보를 표현 가능합니다.
  2. 모든 프로그램은 수많은 비트로 구성되어 있습니다.
  3. 파일의 크기등을 표현할때는 Bit 보다 큰 정보 단위를 사용합니다.

단위 종류

1 Byte를 제외한 대부분의 단위는 일반적으로 이전 단위의 1000배로 정의됩니다.

단위이전 단위
1 Byte8 Bit
1 KB1000 Byte
1 MB1000 KB
1 GB1000 MB
1 TB1000 GB

파일을 다운로드할 때, MB 또는 KB가 아니라 MiB, KiB 등으로 표시되는 경우가 있습니다. 이 단위들은 이전 단위를 1000개가 아닌 1024개로 묶은 것을 의미합니다.

왜 MiB, KiB, GiB를 사용할까?

과거에는 정보의 크기가 작았기 때문에 1000과 1024의 차이가 크게 느껴지지 않았습니다. 하지만 현재는 데이터 크기가 매우 커졌기 때문에 이런 사소한 차이가 큰 오차로 이어질 수 있어, MB와 MiB처럼 명확히 구분하여 사용합니다.

워드

Word(워드) 는 CPU 가 한번에 처리할 수 있는 정보의 크기 단위를 말합니다. 예를 들어 CPU 가 한번에 32bit 씩 정보를 처리할 수 있다면, 1Word 는 32Bit 입니다. 마찬가지로 64비트 CPU에서는 1 Word가 64비트입니다.

  1. Half Word : 워드의 절반 크기
  2. Full Word : 일반 워드 크기
  3. Double Word : 워드의 2배 크기

DWORD, QWORD 단위가 나온 이유

현대의 CPU는 보통 64비트이기 때문에 원래라면 1WORD 가 64bit 여야 합니다. 하지만 초창기 Intel CPU가 16비트용으로 만들어졌고, 이후 나오는 CPU와 호환성 유지를 할 필요가 있었기 때문에 WORD를 16비트로 고정하고 이후 DWORD, QWORD라는 단위를 만들어 확장하게 되었습니다.

MSB, LSB

MSB(Most Significant Bit) 와 LSB(Least Significant Bit) 는 각각 가장 큰 단위의 비트(최상위 비트)가장 작은 단위의 비트 (최하위 비트) 를 말합니다. Byte Order(바이트 순서)와 관계없이 절대적인 위치 개념으로 사용됩니다.

숫자 표현

  • 10 진법(Decimal)은 일상적으로 사용하는 진법이며, 숫자가 9 를 넘어갈 때 자리올림하는 계산법입니다.
  • 2 진법(Binary)은 0 과 1 로 수를 표현하는 방법이며, 숫자가 1 을 넘어갈 때 자리올림하는 계산법입니다.
  • 8 진법(Octal)은 0 ~ 7 로 수를 표현하는 방법이며 숫자가 7 을 넘어갈때 자리올림하는 계산법입니다.
  • 16 진법(HexaDecimal)은 0 ~ 10 과 A ~ F 로 수를 표현하는 방법이며 F 를 넘어갈때 자리올림하는 계산법입니다.

진법 변환

N 진법으로 다른 M 진법으로 변환하는 과정 중 가장 쉬운 방법은 기존 N 진법을 2 진법으로 변환하고, 이를 다시 변환하고자 하는 N 진법으로 변환하는 것입니다. 예를 들어 16진수 0x1A2B 를 8 진수로 변환하려면 아래와 같은 프로세스를 거쳐 0o15053 가 나오게 됩니다.

8진수는 2 ^ 3 = 8 이므로, 2진수 3자리와 정확히 일치합니다. 따라서 2진수로 변환한 후, 오른쪽에서부터 3자리씩 끊어 8진수로 변환하면 됩니다.

진법의 음수 표현

N진법에서 음수를 표현할 때는 먼저 2진법으로 변환한 다음, 2의 보수를 취해야 합니다.

2의 보수

2의 보수란 어떤 수를 그보다 큰 2 ^ n 에서 뺀 값을 의미합니다. 이 말이 굉장히 이해하기 어려운데 모든 Bit 를 반전시키고 +1 을 하면 됩니다.

  1. 2 진법을 제외한 다른 N 진법의 수들을 2 진수로 변환합니다.
  2. 모든 Bit 를 반전시킵니다. (NOT(~) 연산을 취하면 됩니다.)
  3. 1 을 더합니다. (자리올림이 일어날 수 있습니다.)
  4. 다시 원래 N 진법으로 변환합니다.

예를 들어 16 진수 0x1A2B 를 음수로 변환하면 0xE5D5 가 됩니다.

문자 표현

컴퓨터는 Character Set(문자 집합)에 포함된 문자만 이해할 수 있습니다. 이 문자들은 인코딩(Encoding) 과정을 거쳐 컴퓨터가 처리할 수 있는 이진수 형태로 변환되어 사용됩니다.

Character Set

Character Set 은 컴퓨터가 이해할 수 있는 문자집합을 말합니다.

Encoding

인코딩은 문자 집합에 따라 각 문자에 고유한 숫자를 부여한 뒤, 이를 이진수로 변환하는 과정입니다. 같은 문자 집합이라도 인코딩 방식에 따라 이진 표현이 달라질 수 있습니다.

Decoding

디코딩은 인코딩 결과인 이진수를 다시 사람이 이해할 수 있는 문자로 복원하는 과정을 말합니다.

ASCII

ASCII 는 초창기 컴퓨터에서 사용되는 문자집합이며 알파벳, 숫자, 일부 특수문자를 포함한 128 개의 문자로 이루어져 있습니다. 아스키 문자는 8Bit 로 구성되는데 7Bit 는 실제적인 문자표현에 사용되고, 나머지 1Bit 는 오류를 검출하는 패리티 비트(Parity Bit) 로 사용됩니다.

ASCII 문자는 각 문자에 1:1 로 부여된 값(숫자)이 있는데 이를 ASCII Code 라고 부릅니다. 이 값은 인코딩을 통해 이진수로 변환되어 사용됩니다. 예를 들어 revi1337 이라는 문자열의 각 문자는 아래와 같이 인코딩 되어 사용됩니다.

$ echo -n revi1337 | xxd -b -c 1 | cut -d ' ' -f 2 | tr '\n' ' ' | sed -e 's/.$//g'
01110010 01100101 01110110 01101001 00110001 00110011 00110011 00110111

ASCII 코드의 단점

ASCII는 7비트로 구성되기 때문에 총 128개의 문자만 표현할 수 있으며, 한글이나 기타 다국어 문자들을 표현할 수 없습니다.

Unicode

Unicode는 전 세계 대부분의 문자(한글, 이모지 포함)를 표현할 수 있는 범용 문자 집합입니다. 각 문자에는 고유한 번호(Code Point)가 부여되며, 이를 인코딩하는 방식으로는 UTF-8, UTF-16, UTF-32 등이 존재합니다. 사실상 Unicode는 현대 컴퓨터 시스템에서 문자 표현의 사실상 표준으로 사용되고 있습니다.