컴퓨터 구조 - 01. 컴퓨터 내부의 언어체계

    01. 컴퓨터 내부의 언어체계

    컴퓨터는 어떤 말을 사용할까?

    언어는 정보를 소통하기 위해 만들어졌다. 프로그래머는 컴퓨터에게 명령을 내리는 사람이다. 사람이 컴퓨터의 말을 배워서 컴퓨터에게 명령을 내린다.

    언어란 무엇인가

    모든 언어의 뜻은 기호들의 집합으로 인코딩(encoding) 된다. 언어가 제대로 동작을 하려면 의사소통하는 당사자들이 모두 같은 문맥(context)을 공유해서 같은 기호에 같은 뜻을 부여해야 된다.

    문자 언어

    문자언어는 기호를 나열한 것이다. 기호를 정해진 순서대로 나열하여 단어를 만들 수 있다.

    비트

    자연어에서는 문자(character)라고 부르는 것을 컴퓨터에서는 비트(bit)라고 부른다. 비트는 2진법의 바이너리(binary)와 숫자의 디지트(digit)가 합쳐진 말이다. 비트는 2진법을 사용한다 모스부호의 점과 선처럼 두가지 기호중 하나만 담을 수 있다.

    논리 연산

    비트 사용법 중 하나는 예/아니오 질문에 대답하는 것이다. '예'는 참(true) 으로, '아니오'는 거짓(false)로 부른다. 다른 비트들이 표현하는 내용으로 부터 새로운 비트를 만들어내는 동작을 논리 연산(logic operation)이라 한다.

    불리언 대수

    조지 불(George boole)이 만들어낸 불리언 대수(Boolean algebra)도 비트의 연산 규칙 집합이다. 불리언 연산자는 NOT, AND, OR, XOR 이 있다.

    • NOT
      • NOT F = T
      • NOT T = F
    • AND
      • F AND F = F
      • F AND T = F / T AND F = F
      • T AND T = T
    • OR
      • F OR F = F
      • F OR T = T / T OR F = T
      • T OR T = T
    • XOR
      • F XOR F = F
      • F XOR T = T / T XOR F = T
      • T XOR T = F

    드모르간의 법칙

    오거스터스 드모르간(Augustus dDe Morgan)은 불리언 대수에 적용할 수있는 법칙을 추가로 발견했다. a AND b 연산은 NOT(NOT a or NOT b)와 같다는 법칙이다.

    정수를 비트로 표현하는 방법

    양의 정수 표현

    5028을 10진수로 표현하자면 5x10^3 + 0x10^2 + 2x10 + 8 과 같다. 이를 2진수로 표현하게 되면 1x2^12 + 0x2^11 + 0x2^10 + 1x2^9 + 1x2^8 + 1x2^7 + 0x2^6 + 1x2^5 + 0x2^4 + 0x2^3 + 1x2^2 + 0x2 + 0 이며 이를 10진수로 치환하면 4096 + 512 + 256 + 128 + 32 + 4가 된다.

    2진수에서 가장 오른쪽의 비트를 가장 작은 유효 비트(least significant bit - LSB)라 하고, 가장 왼쪽의 비트를 가장 큰 유효비트(most significant bit - MSB)라고 한다.

    2진수 덧셈

    2진수의 덧셈은 각 비트를 LSB에서 MSB로 더하며 결과가 1보다 크면 1을 다음 자리로 올린다.
    덧셈의 결과가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 오버플로(overflow)가 발생한다. 오버플로우는 MSB에서 올림이 발생했다는 뜻이다.

    음수 표현

    부호와 크기

    음수와 양수를 구별하기 위해 부호(sign)을 사용한다. MSB를 부호에 사용한다. 부호비트가 0이면 양수이고, 부호비트가 1이면 음수로 취급한다. 한 비트를 부호에 사용하고 나머지를 크기로 사용하는 방식을 부호와 크기 표현법(sign and magnitude)이라 한다. 해당 표현법은 XOR과 AND를 통한 계산이 불가능하다 +1 과 -1을 더하려할때

    0 0 0 1 = +1
    1 0 0 1 = -1
    1 0 1 0 = -2

    -2라는 결과값을 얻게 되는데 -2는 +1과 -1의 더한 값이 아니다.

    1의 보수

    음수를 표현하기 위해 양수의 모든 비트를 뒤집는 방법이 있다. 이런 방법을 1의 보수(one's complement)표현법 이라 한다. 1의 보수에서 덧셈을 하기 위해서는 MSB쪽에서 올림이 발생한 경우에 LSB로 올림을 전달해야한다. 이를 순환올림(end-around carry)라고 한다.

    0 0 1 0 = +2
    1 1 1 0 = -1
    0 0 0 1 = +1

    2의 보수

    4비트 수를 예시로 +1을 더했을 때 0이되는 비트 패턴은 1111 이다. 1111을 -1로 표현하는 비트 패턴을 2의 보수(two's complement)표현법이라 한다. 어떤 양수의 비트를 뒤집고(NOT을 취하고) 1을 추가하면 음수값을 얻을 수 있다. 이떄 MSB에서 올림이 발생하면 이값은 버려진다. +1 즉 0001의 비트를 뒤집으면 1110 이고 여기에 1을 더하면 1111이 되며 이값이 -1을 표현한다

    실수를 표현하는 방법

    고정 소수점 표현법

    소수점의 비트위치가 항상 일정하게 고정되어 표현하는 것을 고정 소수점(fixed-point) 표현법 이라 한다. 1/2, 1/4 등 2의 거듭제곱을 분모로 사용한다.

    부동 소수점 표현법

    과학적 표기법(scientific notation)을 2진수에 적용한다. 과학적 표기법에서는 10진 소수점이 왼쪽 한 자리 뿐인 소수(가수,mantissa)에 10을 몇번(지수,exponent) 거듭 제곱한 값을 곱하는 방식으로 소수를 표현한다. 0.0012 대신 1.2 x 10^-3 이라고 쓴다.

    IEEE 부동소수점 수 표준

    IEEE는 미국 전자 전기 공학회(Institute of Electrical and Electronic Engineers)의 약자이다. 같은 비트를 사용하더라도 정밀도(precision)을 높이기 위해 정규화(nomalization) 방식이 사용된다. 정규화 방식은 가수부분은 맨 앞으로 이동시키는 방식이다. 32비트는 7비트 정밀도로 표현가능하고 64비트는 15비트 정밀도로 표현할 수 있다.

    2진 코드화한 10진수 시스템

    2진 코드화 한 10진수(BCD, binary-coded decimal)는 4비트를 사용해 10진 숫자 하나를 표현한다. 예를 들어 12를 2진수로 표현하면 1100이지만 BCD로 표현하면 0001 0010 이다. 그러나 더많은 비트를 사용하기에 비효율적 이여서 점점 사용이 줄어들었다.

    2진수를 다루는 쉬운 방법

    8진 표현법

    octal representation은 8진수로 표현하는 기법이다. 비트들을 3개씩 그룹으로 묶어 표현한다. 그러나 이젠 널리 쓰이지 않는다.

    16진 표현법

    8진 표현법 대신 16진 표현법(hexadecimal representation)이 널리 쓰이고 있다. 0~9 다음 10부터 15를 표현하기 위해 ABCDEF라는 기호를 추가하였다. 비트를 4개씩 그룹으로 나누어 표시하는 방식이다.

    프로그래밍 언어의 진법 표기법

    여러 프로그래밍 언어에서는 각 진법별 표기법을 다음과 같이 따르도록 하였다.

    • 0부터 시작하는 숫자는 8진 숫자이다. 017은 8진수이며 10진수로 15이다.
    • 1부터 9사이 숫자로 시작하는 숫자는 10진수이다.
    • 0x가 앞에 붙은 숫자는 167진수이다. 0x12F는 16진수이며 10진수로 303이다.

    비트 그룹의 이름

    세계적으로 8비트 덩어리가 기본 단위로 널리 쓰이기 시작했고 이를 바이트(byte)라고 부른다.

    • 4비트 = 니블
    • 8비트 = 바이트
    • 16비트 = 하프 워드
    • 32비트 = 롱 워드
    • 64비트 = 더블 워드

    텍스트 표현

    아스키 코드

    텍스트를 표현하기위한 여러 방법들 중 정보 교환을 위한 미국 표준 코드(ASCII, American Standard Code for Information Interchange)가 승자가 되었다. 아스키 코드에는 글자를 출력하는데 쓰이지 않고 장치를 제어하기 위해 사용되는 제어 문자(Control Character)가 있다.

    다른 표준의 진화

    국제 표준화 기구(ISO, International Standards Organization)에서 ISO-646과 ISO-8859를 도입하여 영어외 언어를 지원하였다. 그리고 비트의 가격이 떨어짐에 따라 유니코드(Unicode)라는 새로운 표준이 만들어졌고, 문자에 16비트 코드를 부여하였다. 현재는 21비트까지 확장되었다.

    유니코드 변환 형식의 8비트

    유니코드 변환 형식 8비트(UTF-8, Unicode Transformation Format 8bit)라는 인코딩 방법이 하위 호환성과 효율성 때문에 가장 널리쓰이고 있다.

    문자를 사용한 수 표현

    출력 가능하게 변경한 인코딩

    Quoted-Printable Encoding은 쿼티드 프린터블 인코딩, QP 인코딩이라고 하는데, 8비트 데이터를 7비트 데이터만 지원하는 통신 경로를 통해 송수신 하기 위한 인코딩 방법이다. QP인코딩은 전자우편 첨부를 처리하기 위해 만들어 졌다.

    BASE64 인코딩

    3바이트 데이터를 4문자로 표현한다. 3바이트의 24비트를 네 개의 6비트 덩어리로 나누고 6비트값에 출력 가능한 문자를 할당해 표현한다.

    반응형

    댓글

    Designed by JB FACTORY