데이터
데이터는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 포함하여 컴퓨터와 주고받거나 컴퓨터 내부에 저장된 정보를 의미한다.
정보 단위
컴퓨터가 이해하는 가장 작은 정보단위는 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 이다. 당연히 CPU 가 한번에 64bit 씩 정보를 처리할 수 있다면 1Word 는 64Bit 이다.
- Half Word : 워드의 절반 크기
- Full Word : 워드 크기
- Double Word : 워드의 2배 크기
MSB, LSB
MSB(Most Significant Bit) 와 LSB(Least Significant Bit) 는 각각 가장 큰 단위의 비트(최상위 비트)
와 가장 작은 단위의 비트 (최하위 비트)
를 의미한다. Byte Order 에 의해 의미가 변화하지 않으며
절대적인 의미로 기억하면 된다.
숫자 표현
10 진법
10 진법(Decimal) 은 우리가 일상적으로 사용하는 진법이며, 숫자가 9 를 넘어갈 때 자리올림하는 계산법이다.
2진법
2 진법(Binary)은 0 과 1 로 수를 표현하는 방법이며, 숫자가 1 을 넘어갈 때 자리올림하는 계산법이다.
8 진법
8 진법(Octal)은 0 ~ 7 로 수를 표현하는 방법이며 숫자가 7 을 넘어갈때 자리올림하는 계산법이다.
16 진법
16 진법(HexaDecimal) 은 0 ~ 10, A ~ F 로 수를 표현하는 방법이며 F 을 넘어갈때 자리올림하는 계산법이다.
진법 변환
N 진법으로 다른 M 진법으로 변환하는 과정 중 가장 쉬운 방법은 중간에 2 진법으로 변환하는 과정을 거치는 것이다. 예를 들어 16진수 0x1A2B
를 8 진수로 변환하려면 아래와 같은 프로세스를 거쳐 0o15053
가 나오게 된다.
2진법에서 8진법으로 바꾸는 과정이 이해가 안갈수도 있다. 8 진수는 2 ** 3
의 크기. 즉 3 Bit 만큼의 크기를 갖기 때문에 변환된 2진수의 오른쪽에서부터 3개씩 끊어서 변환하는 것이다.
진법 음수 표현
각 N 진법으로 음수를 표현하려면 N 진법을 2 진법으로 변환 후, 2의 보수를 취하는 과정을 거쳐야 한다. 정확한 프로세스는 아래와 같다.
2의 보수
2 의 보수란 어떤 수를 그보다 큰 2 ** n 에서 뺀값을 의미한다. 이 말이 굉장히 이해하기 어려운데 모든 Bit 를 반전을 하고 +1 을 하면 된다.
- 2 진법을 제외한 다른 N 진법의 수들을 2 진수로 변환한다.
- 모든 Bit 를 반전시킨다. (NOT 연산을 하면 된다)
- 1 을 더한다. (자리올림이 일어날 수 있다)
- 다시 N 진법으로 변환한다.
예를 들어 16 진수 0x1A2B
를 음수로 변환하면 0xE5D5
가 된다.
문자 표현
컴퓨터는 Character Set(컴퓨터가 이해할 수 있는 문자집합) 에 해당하는 문자들만 이해할 수 있다. 이 문자는 Encoding 이라는 과정을 통해 컴퓨터가 이해할 수 있는 Binary 로 바뀌어 사용된다.
Character Set
Character Set은 컴퓨터가 이해할 수 있는 문자집합을 의미한다.
Encoding
문자 집합을 컴퓨터가 이해할 수 있도록 Binary 로 변환하는 과정이며, 같은 문자 집합에도 여러 인코딩 방법이 존재한다.
Decoding
인코딩의 반대로 Binary 를 사람이 이해할 수 있는 문자로 변환하는 과정을 의미한다.
ASCII
아스키코드는 알파벳, 숫자, 일부 특수문자를 포함한 128 개의 Character Set 이다. 아스키 문자는 8Bit 의 Binary 로 구성되는데 7Bit 는 실제적인 문자표현에 사용되고, 나머지 1Bit 는 오류를 검출하는 패리티 비트(Parity Bit) 로 사용된다.
ASCII 문자는 각 문자에 부여된 값(Code Point)
이 Encoding 되어 Binary 로 바뀌어 사용된다. 예를 들어 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 코드는 7Bit. 즉, 128개보다 많은 문자를 표현하지 못하기 때문에 한글을 포함하여 ASCII 외의 특수문자도 표현할 수 없다는 단점이 있다.
Unicode
문자와 특수문자, 화살표나 이모티콘까지도 표현할 수 있는 문자 집합이며 현대 컴퓨터에서 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합이다.
글자에 부여된 값 자체를 인코딩 된 값으로 삼지 않고, 값을 다양한 방법으로 인코딩 하는데 이런 인코딩 방법엔 UTF-8, UTF-16, UTF-32 등이 존재한다.