Post

컴퓨터가 숫자를 이해하는 방법

컴퓨터와 관련해 공부하다 보면 컴퓨터는 0과 1로만 모든 정보를 표현하고, 이해할 수 있다고 한다.
근데 여기서 의구심이 드는 부분이 있다. 내가 javascript로 아래와 같은 코드를 작성했다고 생각해 보자.

1
console.log(5 + 5); // 10;

컴퓨터는 0과 1만 안다면서 어떻게 5+5를 이해하고 이를 계산해 10이라는 출력값을 냈을까? 🫢
아래에서 차근차근 알아보자.

비트(bit)

on-off

컴퓨터가 이해하는 가장 작은 정보 단위는 비트(bit)이다. 비트는 위에 ON/OFF 스위치로 생각하면 이해하기 쉽다.
ON/OFF 스위치는 ON, OFF와 같은 2가지 상태를 표현함과 같이 1비트도 동일하게 0, 1 두 가지 정보를 표현할 수 있다.

  • 1비트 표현 범위 : 2
    • (0) (1)
  • 2비트 표현 범위 : 4
    • (0,0) (0,1) (1,0) (1,1)
  • 3비트 표현 범위 : 8
    • (0,0,0) (1,0,0) (0,1,0) (0,0,1)
    • (1,1,0) (1,0,1) (0,1,1) (1,1,1)

특정 비트가 표현할 수 있는 범위를 계산하다 보면 아래와 같은 규칙성을 발견할 수 있다.
n 비트는 \(2^n\)가지 정보를 표현할 수 있다. 🫢

컴퓨터의 기본 정보 단위

  • 비트(Bit): 가장 기본적인 정보 단위로, ‘Binary Digit’의 약어다. 각 비트는 0 또는 1의 값을 가질 수 있다.
  • 바이트(Byte): 8개의 비트로 구성되며, 컴퓨터 데이터 처리 및 메모리 측정의 기본 단위로 널리 사용된다.
  • 킬로바이트(KB): 1,024 바이트로 구성되며, 텍스트 문서, 이미지 파일 등 작은 데이터의 크기를 측정하는 데 사용된다.
  • 메가바이트(MB): 1,024 킬로바이트로 구성되며, 중간 크기의 파일(예: MP3 음악 파일)의 크기를 측정하는 데 사용된다.
  • 기가바이트(GB): 1,024 메가바이트로 구성되며, 대용량 파일(예: 비디오 파일, 대규모 소프트웨어)의 크기를 측정하는 데 사용된다.
  • 테라바이트(TB): 1,024 기가바이트로 구성되며, 매우 큰 데이터 세트(예: 대규모 데이터베이스, 서버의 저장 공간)의 크기를 측정하는 데 사용된다.

진법

컴퓨터에서는 2진법, 8진법, 10진법, 16진법 등 다양한 진법(컴퓨터가 숫자를 표현하는 방식)을 사용한다.
한 개씩 자세히 알아보자. 🧐

2진법

컴퓨터에서 사용하는 2진법은 매우 기본적이면서도 중요한 개념으로 컴퓨터 과학과 디지털 기술의 기본이 되는 숫자 체계이다.

그렇다면 어떻게 0, 1로만 구성되어 있는 2진법으로 1보다 큰 숫자를 표현하는 걸까? 🧐
컴퓨터는 숫자가 1을 넘어가는 시점에 자리 올림을 하여 1보다 큰 숫자를 표현한다.

십진수이진수
11
21 0
31 1
41 0 0
51 0 1
61 1 0
71 1 1
81 0 0 0

그렇다면 1인지 -1인지 음수는 어떻게 표현하는 거지? 🧐

2진법의 음수 표현

컴퓨터에서 음수를 표현하는 방법으로는 2의 보수(2’s complement) 시스템을 사용하는 것이다.
이 방법은 음수를 표현하고, 이진수 덧셈을 통해 음수 연산을 수행하는 데 효과적이다.

2의 보수를 사용하여 -1을 표현하는 방법

  1. 양의 값 1을 2진수로 표현: 0000 0001
  2. 이진수의 모든 비트를 반전: 1111 1110
  3. 반전된 이진수에 1을 더함: 1111 1110 + 1 => 1111 1111

이제 1과 -1을 더해보자.
1(0000 0001)과 -1(1111 1111)을 더하면 결과는 1 0000 0000이 된다.
결과(1)의 가장 왼쪽 비트는 캐리 비트이며, 8비트 시스템에서는 8비트 범위를 벗어났기 때문에 폐기된다.
따라서 8비트 내에 맞는 최종 결과는 0(0000 0000)이다.
이렇게 2의 보수를 사용하면, 별도의 음수 처리 로직 없이도 이진 덧셈만으로 음수 연산을 수행할 수 있다.

근데 1111 1111은 십진수 255가 될 수도 있고, -1이 될 수도 있는데 어떻게 구분하는 것일까?
이는 해당 이진수가 어떤 방식으로 해석되는지에 달려있다.

부호 없는(Unsigned) 타입

부호 없는 데이터 타입에서는 모든 비트가 숫자의 크기를 나타낸다. 1111 1111은 순수하게 숫자 값 255를 나타낸다.

부호 있는(Signed) 타입

부호 있는 데이터 타입에서는 가장 왼쪽 비트(최상위 비트)가 부호 비트로 사용된다. 비트가 0이면 양수, 1이면 음수를 나타낸다.

컴퓨터는 뺼셈을 하지 못한다. 🫢

컴퓨터가 뺼셈을 직접적으로 수행하지 않는다는 말은 일부 진실을 담고 있지만, 정확히 말하자면 컴퓨터는 뺼셈을 다른 방식으로 처리한다. 이유는 CPU 내의 산술 논리 장치(ALU)는 기본적으로 덧셈을 사용(가산기)하여 뺄셈을 처리하기 때문이다. 여기서 말하는 다른 방식이란 2의 보수방식도 포함된다.

예를 들어 5−3을 계산하는 경우 아래와 같이 동작한다.

  1. 5를 이진수로 표현: 0000 0101
  2. 3의 2의 보수를 구함: 1111 1101
  3. 두 이진수를 더함: 0000 0101 + 1111 1101 = 0000 0010
  4. 결과는 0000 0010, 이는 십진수로 2이다.

8진법

8진법은 0부터 7까지의 8개의 숫자(0, 1, 2, 3, 4, 5, 6, 7)를 사용하여 모든 값을 표현한다. 초기 컴퓨터 시스템에서 일부 사용되었으며, 때때로 메모리 주소나 기계어 코드를 간결하게 표현하는데 사용된다. 그러나 현대에는 16진법이 8진법을 대체하여 더 널리 사용되고 있다.

컴퓨터 과학에서 8진법은 주로 이진법 데이터를 좀 더 읽기 쉽게 표현할 때 사용된다. 이진법의 각 3비트는 8진법의 한 자리와 대응된다. (8진수의 각 자리가 2^3 (즉, 8)까지의 값을 나타낼 수 있기 때문에)

이진수 101110은 8진수로 변환하면 56이다.
이진법의 각 3비트는 8진법의 한 자리와 대응되기때문에 101, 110으로 그룹화한 이후 그룹의 결과를 나란히 배치하면 된다.
101 그룹은 이진수로 2^2 + 2^0 = 4 + 1 = 5
110 그룹은 이진수로 2^2 + 2^1 = 4 + 2 = 6

16진법

16진법은 0부터 9까지의 숫자와 A부터 F까지의 문자를 사용하여 총 16개의 기호를 사용하는 체계이다. 16진법은 컴퓨터 과학에서 매우 중요한 역할을 한다. 특히, 2진법 데이터를 간결하고 읽기 쉽게 표현할 때 사용된다. 4비트의 2진수(예: 1101)는 한 자리의 16진수(예: D)로 표현될 수 있다. (16진수의 각 자리가 2^4 (즉, 16)까지의 값을 나타낼 수 있기 때문에)

  • 숫자: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • 알파벳: A(10), B(11), C(12), D(13), E(14), F(15)

이진수 101110은 16진수로 변환하면 2E이다.
101110을 4비트씩 그룹화하기 위해 왼쪽에 0을 두 개 추가한다: 0010 1110
이제 각 그룹을 16진법으로 변환한다.
0010은 2^1 = 2이다.
1110은 2^3 + 2^2 + 2^1 = 8 + 4 + 2 = 14, 16진법에서 14는 E이다.

마지막으로 서로 다른 진법에 대한 변환 과정을 공부해보자.
8진법은 현대에 거의 사용하지 않으니 가장 많이 사용되는 2진수와 16진수 변환을 하도록 해보자!

16진수를 2진수로 변환하기 ❗️

16진수 1A3를 2진수로 변환하려면 각 16진수 자리를 해당하는 2진수로 변환한다.
1 -> 0001
A -> 1010
3 -> 0011
이제 이들을 연결한다 : 0001 1010 0011 🫢

2진수를 16진수로 변환하기 ❗️

이진수 1101 0110을 16진수로 변환하려면 먼저 4비트씩 그룹화를 진행한다.
4비트씩 그룹화: 1101 0110

각 그룹을 16진수로 변환
1101 -> D
0110 -> 6
따라서, 1101 0110의 16진수 표현은 D6이다.

This post is licensed under CC BY 4.0 by the author.

© zwoong. Some rights reserved.