이 글은 강민철님의 혼자 공부하는 컴퓨터구조 + 운영체제를 학습하고 개인적으로 정리한 내용입니다.
들어가며
컴퓨터는 기본적으로 0(전기 신호가 약함)과 1(전기 신호가 셈) 밖에 이해할 수 없다.
이런 컴퓨터가 1보다 큰 수를 어떤 방식으로 이해할 수 있을까?
이번 장에서는 이렇게 1보다 큰 수를 컴퓨터가 어떻게 이해할 수 있는지에 대해 알아본다.
0과 1로 숫자를 표현하는 방법
Bit: 가장 작은 정보 단위
0과 1을 표현하는 가장 작은 정보 단위
n비트로 2^n 가지의 정보를 표현할 수 있다.
그리고 이러한 비트들이 모여서 더 큰 단위들로 표현할 수 있다.
이진법
0과 1로 수를 표현하는 방법으로, 숫자가 1을 넘어가는 시점에 자리 올림
그래서 0과 1밖에 이해하지 못하는 컴퓨터에게 숫자를 알려줄려면 이진수로 알려주면 된다.
예를 들어서 2+8=?을 계산할 때, 2+8을 주는 것이 아니라 10+1000을 넘겨주는 것이다.
이때 1000이 이진수인지 십진수인지 확인하기 위해서는 아래와 같이 별도의 표기를 해준다.
0과 1로 음수 표현하기
그렇다면 0과 1만으로 음수는 어떻게 표현할까?
이때는 2의 보수법을 사용한다.
2의 보수법
모든 0과 1을 뒤집고 1을 더한 값
예를 들어, 11의 보수를 구하고 싶다면
11을 뒤집으면 => 00이고
00에서 1을 더하면 => 01이다.
즉, 11의 음수는 01인 것이다.
이 수가 음수인지는 CPU 내부의 flag라는 값으로 판별한다.
16진법
수가 15를 넘어가는 시점에 자리를 올리는 체계
이진수와 십육진수와의 변환하는 과정은 간단하다.
0과 1로 문자를 표현하는 방법
그렇다면 0과 1밖에 모르는 컴퓨터가 어떻게 문자를 이해하고 표현할 수 있을까?
이를 이해하려면 3가지의 선수 지식이 필요하다.
1) 문자 집합 : 컴퓨터가 이해(표현)할 수 있는 문자의 모음
2) 인코딩 : 코드화 하는 과정 (문자 -> 0/1로 이루어진 문자로 변환)
3) 디코딩 : 코드를 해석하는 과정 (0/1로 이루어진 문자 -> 문자로 변환)
아스키 코드
컴퓨터에서 문자를 표현하기 위한 가장 기본적인 문자 인코딩 표준 (통역사)
초창기 문자 집합 중 하나로 7비트(하나의 문자, 2^7 = 128개) + 1비트(오류 검출)로 구성된 문자 집합
대문자 A는 십진수로 65이고, 십육진수로 41이다.
그리고 65는 A가 아스키코드로 인코딩 된 값이다. 65라는 숫자를 이진수로 표현하면 컴퓨터가 이해하는 대문자 A가 되는 것이다.
즉, 사람이 이해하는 A를 컴퓨터가 이해하기 까지의 과정을 정리하면
1. 사람은 문자 A를 입력한다.
2. 컴퓨터는 아스키 코드에 따라 A를 보고 65구나 라고 인식(A는 65로 인코딩)한다.
3. 65를 내부적으로 1000001이라는 이진수로 변환하여 A라는 문자를 인식한다.
그러나, 이러한 아스키코드에도 한계가 있다.
바로 한글을 포함한 다른 국가의 언어나 특수문자를 표현할 수 없다는 것이다.
따라서 한글을 위한 인코딩 방식이 등장하게 된다.
한글 인코딩 : 완성형 vs 조합형 인코딩
한글은 초성 + 중성 + 종성으로 구성되어 있다.
따라서 완성형, 조합형 인코딩으로 나눌 수 있다.
완성형 인코딩은 글자 하나 단위로 코드를 부여하고, 조합형은 자음과 모음 하나 단위로 코드를 부여한다.
EUC-KR
한글의 완성형 인코딩 방식 중 하나로, 글자 하나에 2바이트 크기의 코드를 부여
그러나 EUC-KR은 몇가지 문제점을 가지고 있다.
1) 2300여개 한글을 표현할 수 있지만 쀏, 뙉, 훽과 같은 복잡한 한글은 표현할 수 없다.
2) 언어별 인코딩을 국가별로 하게 되면 다국어를 지원하는 프로그램을 개발할 때는 언어별 인코딩 방식을 모두 이해해야 한다.
이러한 한계를 해결하기 위해
모든 언어와 특수문자까지 통일된 문자 집합과 인코딩 방식을 사용하고 싶다는 생각을 하게 된다.
이러한 요구에 의해 생겨난 것이 유니코드 문자 집합과 UTF-8이다.
유니코드 문자 집합 & UTF-8 인코딩
유니코드
통일된 문자 집합 (한글, 영어, 특수문자, 이모티콘까지 표현 가능)
유니코드를 구성하는 문자 집합에는 16진수의 고유한 코드 포인트(ex) U+2198)라는 값이 부여되어 있다.
이 코드 포인트를 컴퓨터가 이해할 수 있는 이진수로 바꾸는 것이 인코딩 과정이다. 그리고 이때 사용되는 방식이 utf-8, utf-16, utf-32 등이 있다.
예를 들어 한글이라는 글자를 인코딩할 때
위의 유니코드 문자 집합 테이블에서 쓰여있는 코드 포인트를 그대로 사용하지 않고 특정 인코딩 방식으로 이진수로 변환하여 사용한다.
UTF-8 인코딩
Unicode Transformation Format (유니코드 인코딩 방법)
가변 길이 인코딩 : 인코딩 결과가 1~4바이트 (유니코드의 코드 포인트에 따라 다름)
정리
1. bit는 1과 0을 표현할 수 있으며 정보를 표현하는 가장 작은 단위이다.
2. 이진법은 숫자를 1과 0으로 표현할 수 있고, 현재 자리가 1이 넘으면 자릿수를 올리는 수의 체계이다.
3. 컴퓨터는 bit로 정보를 인식하기에, 숫자나 문자를 모르는 컴퓨터에게 이진법을 기반으로 알려줄 수 있다.
4. 음수는 2의 보수 체계를 통해 표현할 수 있다.
5. 컴퓨터가 이해할 수 있는 문자를 문자 집합이라고 하며, 문자 정보를 0/1로 이루어진 숫자로 변환하는 것을 인코딩이라 하고, 그 반대를 디코딩이라고 한다.
6. 컴퓨터에서 문자를 표현하는 가장 기본적인 표준은 아스키코드였고, 특수문자나 다국어를 표현할 수 없는 문제를 보완하기 위해 16진수의 코드 포인트를 부여하는 유니코드 문자 집합이 등장했다.
7. 유니코드의 코드 포인트를 그대로 컴퓨터에 사용할 수 없기 때문에, 이를 인코딩시켜야 하는데 이때 사용되는 방법들이 utf-8, utf-16 인코딩이다.
정리하자면 컴퓨터가 정보를 표현하는 단위가 bit이고, 이 bit는 0과 1, 2가지의 숫자만 이해할 수 있기 때문에,
어떠한 문자든 숫자든 이진수로 변환하는 과정을 거쳐야 컴퓨터가 인식할 수 있다.
'💻 CS > 🫧 컴퓨터구조' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조] (3) 명령어 (0) | 2025.02.05 |
---|---|
[혼자 공부하는 컴퓨터구조] (1) 컴퓨터 구조 시작하기 (0) | 2025.01.31 |