-
[TIL] 스파르타) CS 강의 수강 (Character Encoding, Numbers Representation)TIL-sparta 2024. 5. 5. 21:56
> CS 강의 7강, '자료의 저장과 표현'을 수강하고, 잘 몰랐던 부분을 최대한 이해한대로 정리해보았다.
학습 키워드: character encoding, unsigned integer, signed integer, floating-point, fixed-point, data structure
1. Character Encoding
1) What is it?:
- 컴퓨터에서 텍스트 자료를 저장할 때는 문자 인코딩 방식을 주로 사용한다. 문자 인코딩이란, 문자를 컴퓨터가 인식하기 쉽도록 숫자로 변환하여 매핑하는 것을 뜻한다. 대표적으로 ASCII, Unicode, UTF-8 등의 방식이 있다.
2) How does it work?:
- ASCII (American Standard Code for Information Interchange): 7 bit로 구성되어 영어 알파벳, 숫자, 특수 문자 등 128 종류의 문자를 표현할 수 있는 방식이다. 초기에는 영문만 사용하여 128개의 공간으로 충분했지만, 나중에 추가적인 문자열 지원이 필요해져서 8 bit(256개)를 사용하는 Extended ASCII 방식이 추가되었다.
- Unicode: 전 세계의 모든 문자를 표현할 수 있는 국제 표준 방식이다. 각 코드는 U+ 뒤에 4자릿 수의 16진수를 붙인 모양으로 표현한다 (예: A는 U+0041). 이 코드는 단순히 표현 방식일 뿐 실제로 저장이나 전송에 사용되지는 않는다.
- UTF-8 (Unicode Transformation Format-8): 유니코드를 컴퓨터에 저장 및 전송하기위해 사용되는 가변 너비 인코딩 방식이다. 앞서 말했듯이 유니코드는 4개의 16진수 형식으로 이루어져 있는데, UTF-8은 이를 4개의 byte로 나누어 첫 번째 byte의 앞 자릿수를 이용하여 다음 몇 개의 바이트를 인코딩에 이용할 것인지를 판단하고, 나머지 바이트의 앞자리에 10을 붙이고 나머지 자릿수를 채우는 식으로 문자 데이터의 너비를 조정한다.
- 변환 방법: 위의 표를 참고하면 유니코드 문자의 각 범위가 몇 개의 바이트를 사용하는지를 알 수 있다. 유니코드의 16진수를 각각 4개 bit의 2진수로 표현한 뒤, byte1의 앞 자리를 알맞게 적어넣고 그 뒤의 xx부분에 변환해둔 2진수 값을 순차적으로 적어넣으면 된다.
- 예시:
3) Why use it?:
- 모든 문자를 표현할 수 있는 Unicode가 있는데 왜 UTF-8 같이 귀찮은 방법을 사용할까? 그 이유는 메모리 공간을 절약하기 위해서다. 숫자 1과 같이 작은 문자를 표현하는데 4 byte를 모두 사용하여 문자를 표기하면 사용하지 않는 공간이 많아져 메모리가 낭비된다.
2. Representation of Numbers
1) What is it?:
- 컴퓨터가 숫자를 표현하는 방식에는 여러가지가 있는데, 일반적으론 unsigned integer, signed integer, floating-point number로 나뉜다. unsigned integer는 부호가 없는 정수를 의미하고, singed integer는 음수와 양수 부호가 있는 정수, floating-point number는 소수점을 가지는 실수를 의미한다.
2) How does it work?:
- unsigned integer: +- 부호가 없는 정수, 그러니까 0을 포함한 자연수를 의미한다. 2진수를 사용하여 있는 그대로의 값을 표현한다. register의 크기에 따라 앞 자리가 비어있는 만큼 0을 추가해준다. 예를 들면, 8 bit의 register에서는 10진수의 42를 2진수로 00101010 이라고 표현하는 식이다.
- signed integer: 레지스터의 맨 앞 bit가 부호bit가 된다. 일반적으로 2's compartment (2의 보수)를 구하는 방식으로 음수를 계산한다.
- one's compartment: 2진수 숫자의 각 자릿수를 뒤집은 숫자다. 예를 들면, 10101100을 01010011으로 뒤집는 식이다.
- two's compartment: 위의 1의 보수에 1을 더한 값이 된다.
- floating-point number: floating-point arithmetic (부동 소수점) 이라는 방식을 사용하는데, 이 중 IEEE 754 방식이 가장 널리 쓰이는 표준이라고 한다. 맨 앞 자리가 부호부가 되고, 그 다음 8 bit가 지수(exponent)부, 그 다음 23 bit가 가수(fraction)부가 된다. 지수부에는 bias라고 해서 32 bit 시스템에서는 127 만큼의 숫자를 더해준 값을 사용한다. 부동소수점의 bias에 대한 자세한 내용은 게시글 하단의 '모두의연구소, 부동소수점 편향된 지수' 링크를 참고하자.
- fixed-point number: fixed-point arithmetic (고정 소수점) 방식을 사용하는데, 1 bit의 부호와 16 bit의 정수, 그리고 15 bit의 소수로 나누어 표현한다.
3) Why floating-point vs fixed-point?:
- floating-point number 표현 방식을 읽다가 fixed-point 방식을 보면 왜 직관적인 fixed-point 표현을 놔두고 복잡하게 floating-point를 하는지 의문이 들 수 있다. 이유만 간단하게 말하자면 fixed-point 방식으로 기록했을 때 보다 floating-point 방식으로 기록했을 때 더 큰 범위의 수를 표현할 수 있기 때문이다. 물론 더 큰 수를 표현하는 만큼 소수점을 기록할 공간이 적어져서 precision을 희생하게 된다. 이 외에도 몇가지 전문적인 이유가 더 있다고 하는데, 하단 링크의 'why-ieee.pdf'에 자세히 설명되어 있다. 나중에 읽어봐야겠다.
--
REFERENCES:
> 강의 링크, 7강. 자료와 저장
> IEEE 754 (IEEE Standard for Floating-Point Arithmetic)
> 모두의연구소, 고정소수점과 부동소수점
> 모두의연구소, 부동소수점 편향된 지수
> berkeley.edu, 'why-ieee.pdf' by w. kahan
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) Project3 마무리 (Dependency Injection) (0) 2024.05.07 [TIL] 스파르타) CS 강의 수강 (HashMap, HashSet) (2) 2024.05.06 프로그래머스) 명예의 전당 (1) 문제 풀이 (JavaScript) (0) 2024.05.04 [TIL] 스파르타) Project 3 - 3일 차 (CSS 관련) (0) 2024.05.03 [TIL] 스파르타) Project 3 - 2일차, Github Pull Request, review, 그 외 팀 프로젝트 관련 사항들 (2) 2024.05.02