본문 바로가기
Computer Science/컴퓨터구조(Computer Architecture)

컴퓨터 정보 표현(데이터)

by 컴돈AI 2024. 3. 27.

목차

정보 단위

  • 컴퓨터는 0과 1만을 이해할 수 있음 -> 0과 1로 모든 정보 표현
    • 0과 1로 표현되는 정보에는 크게 두 종류가 존재
      • 데이터, 명령어
  • 비트(bit)
    • 0과 1을 나타내는 가장 작은 정보 단위
    • 전구 생각하기
      • 켜짐, 꺼짐 (한 개의 전구가 1bit)
      • 1bit는 두 가지 정보 표현 가능
    • n비트 -> 2^n 가지 정보 표현 가능
  • 바이트(byte)
    • 8개의 비트를 묶은 단위
    • 2^8 = 256 가지 정보 표현 가능
    • 1킬로바이트(KB) = 1000byte
    • 1메가바이트(MB) = 1000KB
    • 1기가바이트(GB) = 1000MB
    • 1테라바이트(TB) = 1000GB
    • 참고 : 1024개씩 묶어 표현하는 단위는 (KiB, MiB, GiB, TiB)
  • 워드(word)
    • CPU가 한번에 처리할 수 있는 데이터 크기
    • CPU가 한 번에 16비트를 처리 가능하다면 1워드는 16비트
    • CPU의 1워드가 32비트면 그에 맞는 운영체제 설치해야 함.
      • 32비트 CPU -> 64비트 운영체제 설치 불가
      • 64비트 CPU -> 32비트, 64비트 운영체제 설치 가능

이진법

  • 이진법(binary)
    • 수학에서 0과 1만으로 모든 숫자를 표현하는 방법
    • 이진법으로 표현한 수 = 이진수
  • 이진수 표현 방법
    • 이진수 뒤에 아래첨자 (2)를 붙이거나 이진수 앞에 0b를 붙임
    • 8 = 1000(2) = 0b1000
  • 이진수의 음수 표현
    • 컴퓨터는 0과 1만을 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현해야 함.
    • 2의 보수(two`s complement)를 구해 이 값을 음수로 간주함.
      • 2의 보수란 "어떤 수를 그보다 큰 2^n에서 뺀 값"
        • 11(2)의 2의 보수 = 11(2) 보다 큰 2^n(즉 100(2))에서 11(2)을 뺀 값 = 01(2)
      • 2의 보수를 쉽게 표현하는 방법 : 모든 0과 1을 뒤집고 거기에 1을 더하기
        • 11(2)의 2의 보수 = 00(2)에 1을 더한 값  = 01(2)
    • 2의 보수가 정말 음수의 역할을 하는지 확인하기( -(-A) = A 인 것처럼 2의 보수를 두 번 적용하면 자기 자신이 되어야 함)
      • 1011(2) -> 0100(1)에 1을 더한 값 = 0101(2) 
      • 0101(2) -> 1010(2)에 1을 더한 값 = 1011(2)
      • 자기 자신으로 돌아온 것을 확인할 수 있음.
    • 2의 보수를 사용하면 뺄셈도 단순히 덧셈으로 연산 가능
      • 5 - 3
        • (4비트 연산의 예시) 
        • 5는 0101(2) 이고, 3의 경우 0011(2)
        • 3의 2의 보수 = 1100(2)+1 = 1101(2)
        • 즉, 0101(2) + 1101(2) = 0010(2) = 2
          • 4비트를 초과하는 부분은 생략
        • 정상적으로 계산완료.
    • 그럼 0101(2)이 2의 보수(음수)인지, 5를 표현하는 이진수(양수)인지 어떻게 구분?
      • 이진수만 봐서는 음수인지 양수인지 구분하기 어려움.
      • 컴퓨터 내부에서 어떤 수를 다룰 때는 이 수가 양수인지 음수인지 구분하기 위한 플래그(flag)를 사용
      • 만약 내가 8비트 수를 표현한다고 하면 가장 왼쪽 비트는 부호 비트(sign bit)로 사용
        • 0이면 양수, 1이면 음수
        • 따라서 8비트의 이진수의 범위는 -128(10000000(2))부터 +127(01111111(2))까지
          • 128의 경우 이진수와 2의 보수의 값이 같음. 따라서 음수를 표현하는(가장 왼쪽 비트가 1이므로) -128은 표현가능하고 128은 표현 불가능
          • 128 = 10000000(2) / -128 = 10000000(2)
            • 이를 방지하기 위해 제일 왼쪽 비트를 부호 비트로 사용하는 것
        • 128을 표현하면 오버플로우가 발생
          • 01111111(2) (127)에 1을 더하면 10000000(2)이 되는데 이는 2의 보수 표현에서 -128을 나타내므로 오버플로우
        • -129을 표현하려고 해도 오버플로우 발생
          • 10000000(2)(-128)에 1을 빼면 ( = -1(11111111(2)을 더하면 ) 101111111(2)이 되는데 8비트를 초과하는 제일 앞에 1을 제외하면 01111111(2)이 되어서 -129가 아닌 +127이 되어버림. 이 역시 오버플로우
    • 부호가 있는 n비트 수 표현 범위
      • -2^(n-1) ~ +(2^(n-1)-1)까지 표현 
  • 이진수의 경우, 이진수로 표현할 경우 길이가 너무 길어져 십육진수로 표현하는 경우가 많음
    • 실제로 컴퓨터 내부적으로는 모든 데이터를 이진수로 처리하지만, 사람이 읽고 쓰기에는 매우 비효율적으로 십육진수를 사용
    • 이진수 4비트를 하나의 십육진수로 표현가능
      • 0001101000101011(2) = 1A2B(16)
      • 0001 / 1010 / 0010 / 1011 = 1 / A / 2 / B  (A=10, B = 11)

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

  • 문자 인코딩(character encoding)
    • 문자를 0과 1로 이루어진 문자코드로 변환
  • 문자 디코딩(character decoding)
    • 0과 1로 이루어진 문자코드를 문자로 변환
  • 아스키코드(ASCII)
    • 영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자를 포함
    • 7비트로 표현 = 2^7 = 128개의 문자 표현 가능
    • 실제로는 8비트이지만 1비트는 패리티 비트로 오류 검출을 위해 사용하는 비트
  • 한글 인코딩 방식
    • 완성형 인코딩
      • 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
      • 예를 들면 "가"는 1, "나"는 2, "다"는 3 이런 식으로 인코딩
    • 조합형 인코딩
      • 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식
      • 예를 들어 "ㄱ"은 0010, "ㅏ"는 0011, "ㅇ"는 0001 0101이라고 하면 0010 0011 0001 0101 이런 식으로 인코딩
  • EUC-KR
    • 대표적인 완성형 인코딩 방식
    • 모든 한글 글자에 2바이트 크기의 코드를 부여 (=16비트 = 4자리의 16진수)
    • EUC-KR 인코딩 방식으로 총 2350개의 한글 글자를 표현 가능
      • 문자 집합에 정의되지 않은 쀍, 쀓 같은 글자는 EUC-KR로 표현할 수 없음.
    • 모든 한글을 표현할 수 없다면, 크고 작은 문제 발생가능
  • CP949
    • EUC-KR의 확장버전으로 EUC-KR로는 표현할 수 없는 더욱 다양한 문자를 표현 가능
    • 하지만 이마저도 한글 전체를 표현하기에 넉넉한 양은 아님.
  • 유니코드
    • EUC-KR 인코딩 덕분에 한국어를 코드로 표현 가능해짐. 하지만 모든 한글을 표현할 수 없는 한계 존재. 더욱이 언어별로 인코딩을 나라마다 해야 한다면 다국어를 지원하는 프로그램을 만들 때 각 나라 언어의 인코딩을 모두 알아야 하는 번거로움 존재
      • 모든 나라 언어의 문자 집합에 대한 통일된 인코딩 방식 필요
      • 그래서 나온 것이 유니코드(unicode)
    • 유니코드는 EUC-KR보다 훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합.
    • 유니코드는 현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합.
    • 유니코드는 지속적으로 새로운 문자가 추가될 수 있도록 설계됨. 
    • 유니코드는 UTF-8, UTF-16, UTF-32 등 다양한 인코딩 방식을 제공하여, 다양한 시스템과 플랫폼에서의 호환성을 극대화

출처