기어가더라도 제대로

한 권으로 읽는 컴퓨터 구조와 프로그래밍 - 1 - 본문

책 리뷰

한 권으로 읽는 컴퓨터 구조와 프로그래밍 - 1 -

Damagucci-juice 2022. 6. 12. 04:20

컴퓨터 내부의 언어 체계

컴퓨터는 비트를 가지고 노는 기계다.
비트가 무엇인지 배우고 비트로 무엇을 할 수 있는지에 대해 배운다.
비트나 비트의 모음에 의미를 부여하기 위해 "있다고 치고" 놀이를 해보자.

+ 언어란 무엇인가
+ 문자 언어
+ 비트
+ 논리 연산
    + 불리언 대수
    + 드모르간 법칙
+ 정수를 비트로 표현하는 방법
    + 양의 정수 표현
    + 2진수 덧셈
    + 음수 표현

인코딩

어떤 정보를 정해진 규칙에 따라 변환하는 것(en-code-ing)을 일컫는다.
가, 나, 다, 하 를 숫자로 변환하면 일정한 규칙에 의해 1, 2, 3, 14 로 변환 할 수 있다.

  • 모스 부호 등이 대표적 인코딩이다.

언어란 무엇인가?

모든 언어의 뜻은 기호의 집합으로 인코딩 된다.

  • 나는 밥을 먹는다. == > '나'라는 사람이 '밥'이라는 물질을 '먹는 행위'를 한다. 단어로 약속된 기호를 쓴다.
  • 우리가 사용하는 언어도 일종의 기호의 집합으로 인코딩 된 것이다.
  • 똑같은 단어여도 문맥이 중요하다. 여자친구의 "괜찮아"는 문맥에 따라 적절히 해석해야 한다.
  • 컴퓨터도 마찬가지로 문맥이 중요하다.

문자 언어

문자 언어는 기호를 나열한 것이다.

언어를 구성하는 3가지 요소가 있다.

  1. 기호나 조합 : 한글 24자모로 많은 단어를 조합한다.
  2. 표의 문자 : 일어, 한자
  3. 순서 : 'dog' 와 'god' 은 같지 않다.

"컴퓨터 언어"의 구성요소 3가지

  1. 기호가 들어갈 상자: ㅁㅁ 2비트의 자리수를 표현한다.
  2. 상자에 들어갈 기호: 0 과 1 이 각 비트를 차지할 수 있다.
  3. 상자의 순서: 10 과 01 은 다르다.

비트

언어는 이 상자를 문자(Charactor) 라고 부르고 컴퓨터는 상자를 비트(Bit)라고 부른다.

bit = binary + digit
2진수 숫자

  • 비트를 사용하면 적은 비용으로 편리하게 기호를 담을 수 있다.
  • 기호는 추상적이다.
    • 점과 선
    • 낮과 밤
    • 쌀 보리

그래서 우리는 컴퓨터를 사용한 계산의 비트에 의미를 부여하는 약속, 문맥을 알면

  • 논리
  • 숫자 - 양수, 음수, 실수
  • 언어 - ASCII, UTF-8
  • 색 - RGB, RGB+A

등을 만들어 낼 수 있다!!

논리 연산

날씨가 좋은가? 내 모자를 좋아하나? 등에 예/ 아니오로 대답

  • 예 == 참
  • 아니오 == 거짓

"눈이 오고, 학교에 가는 날이 아니라면 스키를 타러 가라"
* 눈이 오는가 ? ⇒ 참
* 학교에 가는 날인가? ==> 거짓
* "스키를 타러 간다"
다른 비트들이 표현하는 내용으로부터 새로운 비트를 만들어내는 이런 동작을 논리 연산 이라고 한다.

불리언 대수

숫자에 대해서 + - * / 등의 연산자를 알고 있을 것이다. bit 에 대해서도 이런 기능을 하지는 않지만, 연산자가 있다.
이 연산자들을 만든 사람이 조지 불이라는 사람인데, 불의 대수라고 해서 불리언 대수라고 한다.

일반 대수 처럼

  • 결합 법칙
  • 교환 법칙
  • 분배 법칙

등을 적용할 수 있다.

기본적인 불리언 연산자.

  • NOT: 논리적 반대, 거짓인 비트에 NOT 하면 참이 된다.
  • AND: 둘 이상의 비트에 작용하는 연산. 첫 비트가 참이고 두번째 비트가 참인 경우 결과가 참이된다.
  • OR: 첫 비트가 참이거나 두 번째 비트가 참이면 결과가 참이 된다.
  • XOR: 합성 연산인데, 첫 번째 비트와 두번쨰 비트가 다른 값인 경우 참이 된다

드모르간 법칙

이 법칙을 개인적으로 이중 부정 법칙이라고 치환한다.

** a AND b == NOT(NOT a OR NOT b) **

드모르간의 법칙

드모르간의 법칙이 왜 쓸모있느냐하면은 NOT 연산도 하나의 계산이니 비용이 드는데, 오른쪽에 낫낫낫을 다 없애주고 AND 하나만 남기면 얼마나 비용이 절약되겠는가?

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

양의 정수 표현

10진수 체계에서는 10가지 기호인 숫자를 상자에 담을 수 있다.

5028 은

5 X 10^3^ + 0 X 10^2^ + 2 X 10^1^ + 8 X 10^0^
( ) + ( ) + ( ) + ( )

으로 표현 가능하다.
괄호 하나 하나가 상자다. (있다 치고 놀이,, 그렇다 치고 ~)

이 체계는 지수를 적용할 밑으로 10을 사용하기 때문에 밑이 10인 시스템이라고 부른다.

여기서 토막 상식

밑^지수^ (예: 10^3^)

10진수에서도 더 큰 숫자를 표현하기위해 상자를 추가하듯 2진수에서도 상자를 추가해서 해결 가능하다.

2진수 체계는 2를 밑으로 하는 수 체계이다.

5028은 2진수로 이렇게 표현 가능하다.

0001 0011 1010 0100

5028을 10진수로는 4자리 숫자라고 말하고, 2진수로는 13비트 수가 된다.
13자리로 표현 가능한데 가장 앞에 0을 3개 더 붙였다. 이 추가된 0들을 리딩 제로(leading zero)라고 말한다.
이 덕분에 숫자를 표현하는데 필요한 최소 상자의 개수보다 더 많은 상자를 추가할 수 있다.

2진수에서

  • 가장 오른쪽의 비트(LSB)
    • 가장 작은 유효 비트(least significant bit)
  • 가장 왼쪽의 비트(MSB)
    • 가장 큰 유효 비트(most significant bit)

2진수의 덧셈

10진수를 덧셈할 때 가장 오른쪽 상자부터 더하고 올림이 있으면
1을 그 다음 자리 숫자를 더할 때 같이 더한다
2진수도 마찬가지다.

각 비트를 LSB 에서 MSB 쪽으로 더하며 결과가 1보다 크면 1을 다음 자리 (왼쪽)로 올린다.

근데 이걸 사람은 그냥 하지만 컴퓨터는 어떻게 한단 말인가? 바로 논리 연산 을 통해서 한다.

논리연산으로 2진수 덧셈

  • 두 비트를 서로 더한 결과
    • XOR
  • 올림
    • AND

비트 더하기 비트는 결과가 올림도 처리하기 때문에 3비트다.

  • 오버플로
    • 덧셈 결과가 우리가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 나타나는 현상
    • MSB 에서 올림이 발생했다는 뜻
    • 컴퓨터는 이를 조건코드 레지스터에 플래그를 세워서 정보를 담아둔다.
    • 그 중 오버플로 비트가 있는데 여기에 MSB 에서 올림한 1을 담아 놓는다.
  • 언더 플로
    • MSB 위쪽에서 1을 빌려오는 경우
    • 뺄셈을 할 때를 떠올려 보자. 10 - 9 를 하면 1의 자리에서 10을 빌려와서 9를 빼고 1을 남기는것

음수 표현

  • 부호와 크기 방법
  • 1의 보수
  • 2의 보수

부호와 크기 방법

  • 비트 하나를 써서 양부호화 음부호를 표현
  • MSB 에 부호 비트를 넣기로 약속
  • 4비트에 1개는 부호를 넣고 나머지 3 비트로 수를 표현한다.
  • 단점
    • 0을 표현하는 방법이 두가지다(1000,0000)
    • XOR과 AND 를 이용한 덧셈을 못한다.
      • 예시) 1과 -1을 계산
      • 0 0 0 1 == 1
        1 0 0 1 == -1
        + ------------
        1 0 1 0 == -2

1의 보수

  • 양수의 보든 비트를 뒤집는 방법
  • 구성
    • 부호비트 / 나머지 비트
    • NOT 연산을 통해 수를 얻음
    • 0111(+7) => 1000(-7)
  • 단점
    • 0 표현 방식 두가지
    • 순환 올림
      • MSB 에서 올림이 발생하면 LSB로 올림을 전달
      • 이를 위해 별도 장치 필요
      • 비용 증가 ㅠㅠ
    • 다만 덧셈은 가능
    • 0010 (2)
    • 1110 (-1)
      + -----
    • 0001 (1)
      하지만 복잡하다

2의 보수

하드웨어를 추가할 수 없고, AND, XOR 연산만 사용해야 한다면?
+ 1을 했을 때 0이 나오는 패턴을 찾고 이 패턴을 - 1 이라고 부르자

  • 예시
    0001 == 1
  1. 각 자리의 비트를 뒤집는다(NOT) : 1110
  2. 여기에 1을 더한다 : 1111
  3. 원래수인 1과 1111을 더하면 : 0

0 중복 없음!
0000
각자리의 영을 뒤집어서 에 1을 더하면 1111 + 1 == (1)0000
올림처리 되는 1은 없는 숫자 취급한다.

즉 0 == 0 이다.

'책 리뷰' 카테고리의 다른 글

앞으로 읽을 책들 정리  (2) 2022.07.03
몰입의 즐거움 - 미하이 칙센트  (6) 2022.06.18
Comments