데이터
데이터는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 포함하며, 컴퓨터와 주고받거나 컴퓨터 내부에 저장되는 정보를 의미합니다.
정보 단위
컴퓨터가 이해할 수 있는 가장 작은 정보 단위는 Bit(0 과 1 일 표현할 수 있는 가장 작은 정보단위)
입니다.
- n Bit 로
2 ^ n
만큼의 정보를 표현 가능합니다. - 모든 프로그램은 수많은 비트로 구성되어 있습니다.
- 파일의 크기등을 표현할때는 Bit 보다 큰 정보 단위를 사용합니다.
단위 종류
1 Byte를 제외한 대부분의 단위는 일반적으로 이전 단위의 1000배
로 정의됩니다.
단위 | 이전 단위 |
---|---|
1 Byte | 8 Bit |
1 KB | 1000 Byte |
1 MB | 1000 KB |
1 GB | 1000 MB |
1 TB | 1000 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비트입니다.
Half Word
: 워드의 절반 크기Full Word
: 일반 워드 크기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 을 하면 됩니다.
- 2 진법을 제외한 다른 N 진법의 수들을 2 진수로 변환합니다.
- 모든 Bit 를 반전시킵니다. (NOT(~) 연산을 취하면 됩니다.)
- 1 을 더합니다. (자리올림이 일어날 수 있습니다.)
- 다시 원래 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는 현대 컴퓨터 시스템에서 문자 표현의 사실상 표준으로 사용
되고 있습니다.