1장 컴퓨터 내부의 언어 체계

young·2022년 6월 13일
0

📖 1장 keywords

  • 여는 글

  • 비트

  • 2진수
    8진 표현법, 16진 표현법

  • 아스키 문자, 인코딩

  • 색을 숫자로 표현하기
    RGB, RGBA, 16진 트리플렛


⭐️ 내가 책을 읽는 자세

그렇다~고 설명해주는 것에 왜? 하고 꼬리를 무는 언어적 이해를 원하기 보다
그냥 그렇구나~하고 현상을 이해하는 게 좋을 것 같다고 생각했다.
꼬리에 꼬리를 물면 끝이 없고 다 어려워진다...

일단 넓게 이해하고
나중에 지식이 늘면 깊게 배워보자
지금 다 알고자 하면 과식한다

참고로 책에는 더 자세한 내용이 들어있고
나는 내가 받아들일 수 있는 것만 정리해본다!


이 책은 컴퓨터 하드웨어를 탐구하기 시작해서, 하드웨어에서 소프트웨어가 어떻게 작동하는지 살펴보고, 프로그래밍 기술과 협력 스킬에 대해서 설명해준다.
들어가기에 앞서, 컴퓨터는 비트를 가지고 노는 기계라고 표현한다.

비트가 뭐지?

얼마 전 배운 내용에서 "IPv4의 할당량 초과로 IPv6가 나왔다"는 이야기를 듣고
32비트는 무엇이며 128비트는 무엇인지, 정확한 비트 계산법이 무엇일까 궁금했었는데 이 책의 초입에서 설명해 주었다.

자연어에서 문자(character)라고 하는 것은 컴퓨터에서 비트(bit)라고 한다.
2진법이라는 binary와 숫자를 뜻하는 digit의 합성어이다.

비트를 사용하는 이유는 지금 읽고 있는 2장에서 나온다.

비트는 이름처럼 2진법을 사용한다. 0또는 1만으로 10진수를 표현한다.

논리 연산

그동안 자주 썼던 boolean이라는 논리 자료형은 George Boole이라는 사람이 만들었다고 한다.
다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 것을 논리연산(logic operation)이라고 한다.

양의 정수 표현

10진 표현법으로 12345(일만 이천 삼백 사십 오)는

10^410^310^210^110^0
12345

위 표의 각 열을 곱하여 더한 값이다.
10진수에서는 10을 밑으로 했다면, 2진수에서는 2를 밑으로 한다.
단, 0과 1만 사용하는 것이다.
각 거듭제곱은 0번 또는 1번 더할 수 있다.

2의 거듭제곱들의 합으로 표현한다.

12345를 2진수로 표현하면,

2^0 x 1 +
2^1 x 0 +
2^2 x 0 +
2^3 x 1 +
...

너무 큰 수를 골라서 인터넷의 힘을 빌렸다.

The number 12345 it can be expressed like:
8192 + 4096 + 32 + 16 + 8 + 1
Therefore, the answer is: 11000000111001

2^13 x 1 + 2^12 x 1 + .... + 2^5 x 1 + 2^4 x 1 + ... + 2^0 x 1

위와 같은 과정으로 10진수 12345는 2진수 11000000111001으로 표현할 수 있다.

10진수로 다섯자리 수라고 할 수 있고,
2진수로는 14비트 수가 되는 것이다.

LSB, MSB

10진법에서는 12345를 1과 5를 각각 만의 자리 수, 일의 자리 수 라고 표현했다면

2진수 11000000111001 에서는
가장 오른쪽의 비트를 가장 작은 유효 비트라는 뜻의 LSB라고 하고,
가장 왼쪽의 비트를 가장 큰 유효 비트라는 뜻의 MSB라고 한다.

LSB를 변경하면 2진수의 값이 가장 작게 변경되고
MSB를 변경하면 2진수의 값이 가장 크게 변경되기 때문이다.

컴퓨터에서는 11000000111001가 14비트라고 해서 14비트만 취급하는 게 아닌,
일정한 비트 수 (16비트 등)을 정해두고 MSB에 0을 추가해서 비트 수를 맞춘다.
= 항상 일정한 개수의 비트를 사용해 값을 표현한다.

10진수 12345를 16비트 2진수로 저장하면 0011000000111001가 된다.

2진수 덧셈

101
+001
---
LSB의 합이 2이므로 10진수 2 = 2진수 10
   10
 +100
 ----
 110이 된다

만약 4비트 덧셈에서 MSB를 초과하는 계산을 하게 된다면
4비트 MSB까지만 표현을 하고 5비트 이상은 표현할 수 없게 된다.
이렇게 MSB에서 올림이 발생하는 경우 오버플로우라고 한다.

언더플로우는 MSB 위쪽에서 1을 빌려오는 경우를 말한다.

음수 표현

1 + (-1) = 1 - 1
양수 + 음수 = 양수 - 양수

부호와 크기

MSB를 부호(1은 -, 0은 +)로 사용하는데 쓰고 나머지 비트는 0부터의 거리(절댓값)를 표현하는 데 쓴다.
+0과 -0이 발생하는 등 여러 문제점이 있다.

1의 보수

마찬가지로 부호 비트와 나머지 비트로 나누고, 양수의 모든 비트를 뒤집은 것을 음수로 한다.
예를 들어 0111 (10진수 7)을 기준으로 -7을 2진수로 표현하자면 1000이 되는 것이다.
+0과 -0 발생, 양수와 음수의 덧셈을 할 때 순환 올림이라는 방식을 사용한다.
= 컴퓨터에서 사용하려면 순환 올림을 수행할 하드웨어가 추가적으로 필요하다.

✔️ 2의 보수

2의 보수 또한 부호 비트와 나머지 비트로 나눈다.
+1에 더했을 때 0이 되는 비트를 -1이라고 한다.
0001 + ? = 0000
LSB에 1이 들어가야 하고...
1111이 -1이 된다.

어떤 수의 비트를 뒤집고(NOT) 1을 추가하면 그 수의 음수를 얻을 수 있다.
오버플로우 되는 값은 버린다.

2의 보수를 사용하면 0의 중복 표현 문제가 없어진다.

4비트에서는 -8부터 7까지 표현할 수 있고
8비트에서는 -128부터 127까지 표현할 수 있고
16비트에서는 -2048부터 2047까지 표현할 수 있고
...
64비트는 최대 2^63까지 표현할 수 있고 총 2^64개의 수를 표현할 수 있다.

2진수를 다루는 방법

8진 표현법

8진은 밑이 8이란 뜻이다.
0부터 7까지 쓸 수 있다.

2진수 비트를 3개씩 묶어서 사용한다. (2^3)

100101111001과 같은 2진수를 8진 표현법으로 바꾸면

100101111001
4571

위와 같은 방식으로 4571이 된다.

10진수로는 2425다.

✔️ 16진 표현법

과거와 다르게 컴퓨터가 8비트의 배수를 이용해 만들어지면서
요즘은 8진 표현법(한자리 비트수 3)을 사용하지 않고 16진 표현법(한자리 비트수 4)을 사용한다.

한 자리에서 0부터 15까지 표현하기 위해 10부터 15까지는 알파벳으로 대체한다.
10~15는 a~f로 표현한다.

2진수 비트를 4개씩 나누고 0부터 f까지의 기호를 붙인다.
비트 패턴이 16가지 경우의 수만 있다고 할 수 있다.

1010010110101101 이라는 2진수는

1010010110101101
a5ad

16진수 a5ad가 된다.

프로그래밍 언어에서 각 표현법을 표기하는 방법

10진수는 1부터 9까지의 숫자로 시작한다.

8진수 앞에는 0이 붙는다.
위에서 표현한 8진수 4571을 사용하려면 04571이라고 표기한다.

16진수 앞에는 0x이 붙는다.
위에서 표현한 16진수 a5ad는 0xa5ad라고 표기한다.

C++에서 2진수는 0b라는 접두사를 붙여서 사용한다.

byte

비트 1개는 0또는 1이고
이것을 기본 단위로 사용하기에는 조직화 되어 있지 않다고 할 수 있다.

컴퓨터에서는 8비트 묶음이 문자 인식의 기본 단위로 쓰이고 이를 바이트(byte)라고 한다.

8비트 = 1바이트

유니코드

아스키 코드는 모든 기호에 7비트를 사용하고
컴퓨터는 8비트를 기준으로 아스키 문자를 저장해야 한다.

문자 코드에 따라 각기 다른 인코딩을 사용해 비트수 변환 처리를 해결한다.

인코딩은 다른 비트 패턴을 표현하기 위해 사용하는 비트 패턴을 말한다.

비트로 숫자를 표현하고,
숫자로 문자를 표현하고,
다른 숫자로 이 문자를 뜻하는 숫자를 표현한다.

유니코드 변환 형식 8비트 (UTF-8)

UTF-8은 문자를 8비트 묶음(octet)의 시퀀스로 인코딩 한다.

모든 아스키 문자를 8비트로 표현하고,
아스키 문자가 아닌 경우 아스키 문자를 처리하는 프로그램이 깨지지 않는 방법으로 인코딩한다.

색을 숫자로 표현하기

컴퓨터 모니터는 RGB 광선을 섞어서 색을 만들어 낸다. (RGB Color Model)

색은 정육면체 Color Cube로 표현할 수 있다.
가로, 세로, 높이 각 축의 값이 0이면 해당 빛이 없는 상태고 1이면 최대 밝기라고 할 수 있다.

(1,0,0) 빨간색
(0,1,0) 녹색
(0,0,1) 파란색

(0,0,0)이면 빛이 없는 검은색이고
(1,1,1)이면 가장 밝은색인 흰색이다.

RGB는 24비트를 사용해 하나의 색깔당 8비트 필드를 맡는다.
하지만 컴퓨터는 24비트 단위로 처리하지 않도록 설계 되어있기 때문에 32비트로 표현해야 한다.
그렇게 남는 8비트로 투명도를 표현한 것이 RGBA(alpha)다.

16진 트리플렛 (색 인코딩)

웹에서는 RGB 색을 16진 트리플렛으로 표현한다.
각각의 8비트 색값을 두 자리 문자로 된 16진 표기법으로 바꾼다.

# 뒤에 여섯 자리 16진 숫자를 추가해 #rrggbb로 표현한다.
(그래서 숫자+문자가 있던 거구나!)

16진 숫자는 0부터 f까지 사용하기 때문에

#000000 : 검은색
#fffffff : 흰색이 된다.

alpha를 표현할 때는 조금 더 복잡한, 전혀 다른 방식을 사용한다.

profile
즐겁게 공부하고 꾸준히 기록하는 나의 프론트엔드 공부일지

0개의 댓글