소프트웨어 공학용 수학에 관련해서 pocu에서 공부하고 있다.
지난 학기 때, 실무 프로그래밍 입문을 공부하고 열심히 노트정리도 했지만, 중간고사, 기말고사가 각각 끝나고 리마인드 하지 않은게 후회됬다.
"공부를 제일 열심히 했을 때 기록해두면 장기기억으로 남았을 텐데"라고 말이다.
그래서, 요번에 중간고사가 끝난 때, 중요한 부분들을 다시 하나하나 정리하고자 한다.
어떤 것들을 정리할지 한번 생각해 보았는데 다음과 같다.
- 2의 보수의 개념과 필요성
- 컴퓨터에서 문자를 어떻게 표현하는가?
- 컴퓨터에서의 실수 표현
2의 보수라는 개념이 도입된 이유를 알기 위해서, 우선 정수가 무엇이고, 컴퓨터에서는 어떻게 저장되는지 부터 알아보자.
음의 정수, 0, 양의 정수로 이루어진 숫자들의 집합이다.
(이 정의를 모르는 사람은 없을 것이라 생각한다.)
그렇다면 2진법 밖에 존재하지 않는 컴퓨터에서는 정수를 어떻게 저장하고 표현할까?
일반적인 부호 있는 정수를 이야기해보자
최상위 비트를 부호 비트로 사용하여 표현한다. 이런 특성 때문에 1bit가 사라지기 때문에 같은 bit수더라도, 부호없는 정수를 표현할 때보다 수의 크기가 적어진다.
예를들어 보자
8bit 일 경우
최상위비트를 부호비트로 사용하고 그 아래 7bit를 표현 방법에 따라 다르게 표현될 수 있다.
음수를 표현하는 다양한 방식에 대해 알아보도록 하자.
부호가 없는 정수를 표현할 때 처럼 그대로 표현하고, 최상위 비트를 부호비트로 그대로 사용하는 것이다.
8bit를 기준으로 예를 들어보자
10 은 0000 1010 이다
-10 은 1000 1010 이다.
이렇게 하면 0은 어떻게 될까?
0000 0000
1000 0000
둘다 0을 표현하는 비트 패턴이다.
또 연산을 해보자. 1000 1010 + 1000 1010 을 하면 1001 0100이 되는데 원래 결과로 나와야 할 0과는 아주 많이 다른 값이다. 이렇기 때문에 부호 절대값 표기법은 폐기됬다.
어원을 해석해보면, 상호 보완하는 수로, 임의 수를 보완해주는 다른 임의의 수다
진법에서 보수는
"A라는 수에 B라는 수를 더해서 각 자리마다 자리올림이 발생하고 해당 자리는 0이 될 때, B를 A에 대한 r의 보수라고 정의한다."
말로는 이해하기 어려우니 간단 예를 보자
2의 10의 보수는 8이다
12의 10의 보수는 88이다.
위의 진법에서의 보수의 말의 예시이다.
320 -4 를 하면 우린 보통 바로 316이란 값을 얻을 것이다.
하지만 보수를 사용하면?
320-4+1000-1000을 하면된다.
4의 10의 보수인데 자리수가 4개일때를 구하고, 320과 더한다. 그 후, 천의자리를 없애면 원하는 값을 얻을 수 있다.
996 + 320 - 1000 = 316
2진법의 2의 보수를 사용해서 음수를 표현하면, 아까 문제였던
(1) 0을 표현하는 비트패턴이 2개였던 문제
(2) 음수+양수에서 문제가 되었던 문제
이 두가지를 해결할 수 있다.
그렇기 때문에 컴퓨터에서는 2의보수를 활용하여, 음수를 표현하고 연산을 한다.
#cf) 컴퓨터는 덧셈 밖에 못한다. 깨알 상식이다.
2의 보수로 음수를 표현하는 순서를 정리해보면
위의 방법을 통해 -10을 2의보수로 표현해보자.
이것을 다시 양수로 바꾸려면 2의보수를 똑같이 취하면 된다.
각 두수를 더해보자
-10 1 0110
+10 0 1010
1(오버플로우) 0000
원하는 값 0이 나오게 된다.
0과 1 밖에 없는 컴퓨터 세상에서, 현실세계에 복잡한 것들을 표현하기 위해 많은 법칙이 생겼고, 이를 통해서 컴퓨터는 값을 저장하고 표현한다. 결국 컴퓨터 내부에 모든 것들은 단순한 트랜지스터로부터 시작했고, 모든 것이 약속이라는 생각을 갖게 되었다.
만약 약속이 없다면, 0,1은 그냥 아무런 의미 없는 숫자일 것이다.
참으로 신가한거 같고, 기본 토대 약속위에 새로운 것을 쌓고 쌓아 지금의 컴퓨터가 됬다는점이 놀랍다.
컴퓨터 내부 동작원리를 알아야 결국 좋은 개발자가 될 수 있을거라 생각해서 소프트웨어 공학 수학을 공부하고 있는데, 잘하고 있는거 같다.