[혼공컴운] Ch02 데이터

Hyunjoon Choi·2023년 7월 9일
0

혼공컴운

목록 보기
2/15

📢 본 글은 혼공학습단 미션과 함께 정리해보는 글 입니다.

0과 1로 숫자를 표현하는 방법

컴퓨터는 0과 1만 이해할 수 있다. 그런데 어떻게 1보다 큰 수를 이해할 수 있을까?

정보 단위

비트 (bit)

  • 0과 1을 나타내는 가장 작은 정보 단위를 비트라고 한다.
  • NN개의 전구로 표현할 수 있는 가짓수는 2N2^N 가지이다.
  • 프로그램은 수많은 비트로 이루어져 있으나, 비트로 직접 표현하지 않고 비트보다 더 큰 단위를 사용해 표현한다. (ex: MB, GB)
단위이전 단위
1바이트 (1byte)8비트 (8bit)
1킬로바이트 (1kB)1,000바이트 (1,000byte)
1메가바이트 (1MB)1,000킬로바이트 (1,000kB)
1기가바이트 (1GB)1,000메가바이트 (1,000MB)
1테라바이트 (1TB)1,000기가바이트 (1,000GB)

이전 단위를 1,024개씩 묶은 단위는 kiB, MiB, GiB 등과 같은 것들이다.
1kB는 1,024byte, 1MB는 1,024kB 등과 같이 표현하는 것은 잘못된 관습이다. 과거에는 용량이 크지 않았기 때문에 1,000을 1,024로 계산해도 문제가 없었지만, 지금은 오차가 매우 크게 나기 때문에 정확하게 1,000배 씩 표현한다.

워드 (word)

  • CPU가 한 번에 처리할 수 있는 데이터 크기
  • 한 번에 N비트를 처리할 수 있으면 1워드는 N비트
  • 하프 워드: 워드 절반
  • 풀 워드: 1배 크기의 워드
  • 더블 워드: 2배 크기의 워드
  • x32, x64가 바로 워드 크기를 의미

이진법

  • 0과 1로 수를 표현하는 방법
  • 숫자가 1을 넘어가는 시점에 자리올림
  • 즉 우리가 컴퓨터에게 수를 넘겨줄 때는 이진수를 넘겨주면 된다.

숫자 구분

우리가 넘겨준 수가 이진수로 표현된 수인지, 아니면 십진수로 표현된 수인지를 어떻게 구분할까? (ex: 1000을 보낼 때, 1000이 실제 1000일까 아니면 8일까?)
1000(2)1000_{(2)}로 표현하거나, 0b1000으로 표현한다. (숫자, 코드)

음수 표현

이진법에는 음수가 없기 때문에 0과 1만으로 음수를 표현해야 한다. 이때 활용되는 방법이 2의 보수법 (two’s complement - 어떤 수를 그보다 큰 2n2^n에서 뺀 값, 즉 모든 0과 1을 뒤집고 1을 더한 값)이다.
참고로 이진수의 0과 1을 뒤집은 수1의 보수라고 한다.

2의 보수의 한계
0이나 2n2^n 형태의 이진수에 2의 보수를 취하면 원하는 음수값을 얻을 수 없음
0000(2)0000_{(2)}1111(2)1111_{(2)}10000(2)10000_{(2)} (10000(2)10000_{(2)}가 0을 음수로 표현한 것일까?) → 이 때는 자리 올림이 발생한 비트의 1을 버림
1000(2)1000_{(2)} (232^3) → 0111(2)0111_{(2)}1000(2)1000_{(2)} (232^3을 음수로 표현한 값이 양수로 표현한 값과 같다) → 이 문제는 본질적으로 해결하기 어렵다. 즉 n 비트로는 2n-2^n2n2^n을 동시에 표현할 수 없다.)

플래그

1011(2)-1011_{(2)}를 표현하기 위한 0101(2)0101_{(2)}와 십진수 5를 표현하기 위한 0101(2)0101_{(2)}를 구분하기 위해 사용되는 개념이다.

CPU 내부에 있는 플래그 레지스터의 값을 통해 식별한다.

십육진법

  • 0과 1만으로 모든 숫자를 표현한다면 숫자의 길이가 너무 길어진다.

  • 십육진법을 활용해서 이 문제를 해결한다.

  • 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다.

  • 십진수 10 ~ 15를 A ~ F로 표기한다.

  • 이진수처럼 아래첨자를 붙이거나 숫자 앞에 0x를 붙여 구분한다. (숫자, 코드)

이진수 → 십육진수

  • 십육진수를 이루는 숫자 하나를 이진수로 표현하려면 4비트가 필요 (십육진수는 한 글자 당 열여섯 종류의 숫자를 표현할 수 있기 때문)
  • 십육진수 한 글자를 4비트의 이진수로 간주

십육진수 → 이진수

  • 반대로 이진수 숫자를 네 개씩 끊고, 끊어준 네 개의 숫자를 하나의 십육진수로 변환한 뒤 이어붙이면 됨

0과 1로 문자를 표현하는 방법

문자 또한 어떻게 컴퓨터가 이해할 수 있는지 보자.

문자 집합과 인코딩

문자 집합 (character set)

  • 컴퓨터가 이해할 수 있는 문자의 모음을 뜻한다.
  • 아스키 코드 (ASCII, American Standard Code for Information Interchange)
    • 초창기 문자 집합 중 하나
    • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
    • 7비트로 하나의 문자 표현 (즉, 아스키 코드에서 표현될 수 있는 문자들은 272^7 = 128개)
      • 8비트 중 1비트는 오류 검출을 위해 사용되는 parity bit
    • 아스키 문자들은 0부터 127까지 총 128개의 숫자 중 하나의 고유한 수에 일대일로 대응됨
    • 코드 포인트 (code point): 글자에 부여된 값 (ex: A = 65)
    • 다른 언어, 다양한 특수 문자 표현 불가능 → 다른 인코딩 방식들이 나옴

인코딩 (encoding)

문자를 0과 1로 이루어진 문자 코드로 변환하는 과정을 뜻한다.

  • 한글 인코딩
    • 완성형 인코딩
      • 초성, 중성, 종성의 조합으로 이루어져 완성된 하나의 글자에 고유한 코드를 부여
      • ex: EUC-KR (글자 하나에 2바이트 크기의 코드 부여, 표현 문자 양 제한됨 - 2350개 정도)
    • 조합형 인코딩
      • 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 이들의 조합으로 하나의 글자 코드를 완성하는 방식
      • 초성, 중성, 종성에 해당하는 코드를 합하여 하나의 글자 코드를 만드는 방식

디코딩 (decoding)

0과 1로 이루어진 문자 코드를 문자로 변환하는 과정을 뜻한다.

유니코드 및 UTF-8

  • 언어별로 인코딩을 나라마다 하면 다국어를 지원하는 프로그램을 만들 때 국가별 인코딩을 모두 알아야 하는 문제 발생
  • 모든 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식이 있도록 함
  • 유니코드현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합
    • 다양한 방법으로 인코딩함, UTF-8이 가장 대중적
      • 가변 길이 인코딩 (인코딩 결과가 1 ~ 4 바이트)
      • 인코딩 결과가 몇 바이트가 될 지는 유니코드에 부여된 값에 따라 다름

미션

  • 65p 확인 문제 3번: 1101(2)1101_{(2)}의 음수를 2의 보수 표현법으로 구하기
    • 2의 보수법은 0과 1을 반전시킨 뒤 1을 더하는 방식이라고 하였습니다. 따라서 1101(2)1101_{(2)}0010(2)0010_{(2)}0011(2)0011_{(2)}가 됩니다.

부족하거나 보완할 점이 있다면 댓글 부탁드립니다 😃

profile
개발을 좋아하는 워커홀릭

0개의 댓글