컴퓨터는 명령어를 처리하는 기계이다. 즉, 명령어는 컴퓨터를 실질적으로 작동시키는 매우 중요한 정보이다. 우리가 C, C++, Java, Python과 같은 프로그래밍 언어로 만든 소스 코드는 컴퓨터 내부에서 명령어로 반환된다. 이 명령어의 정체가 무엇인지 한번 공부해보자!
컴퓨터는 C, C++, Java, Python과 같은 프로그래밍 언어를 이해할 수 없다. 이 언어들은 사람이 이해하고 작성하기 쉽게 만들어진 고급 언어 이기 때문이다. 반대로 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 한다. 따라서 우리가 고급 언어를 사용해 열심히 프로그래밍한 결과물은 저급 언어로 변환 과정을 거쳐야 컴퓨터가 비로소 이해하고 실행할 수 있는 것이다.
저급 언어에는 기계어와 어셈블리어, 이렇게 두 가지 종류가 있다.
컴퓨터에서 숫자를 다룰 때 이진수는 필수적인 존재이다. 그런데 이 이진수로 양수뿐만 아니라 음수도 표현할 수 있다는 사실을 알고 있는가? “0과 1로만 이루어진 이진수로 어떻게 음수를 표현할 수 있을까?“라는 의문이 들 수 있다. 컴퓨터 세계에서 음수를 표현하는 다양한 방법과 그 원리를 알아보자.
컴퓨터는 사람처럼 “이건 양수, 저건 음수"라고 직관적으로 판단하지 못한다. 대신, 이진수를 음수로 해석할 수 있는 몇 가지 규칙(약속)을 만들어 두었다. 그중 가장 간단한 아이디어는 특정 비트를 “부호 비트"로 정하는 것이다.
맨 앞의 비트를 부호로 사용한다.
0
은 양수, 1
은 음수로 간주한다.10000001
은 부호 비트가 1이므로 음수로 해석한다.하지만 부호 비트를 사용하는 방식에는 문제가 있다. 음수와 양수를 동일하게 다루기 어렵다는 점이다. 이에 조금 더 똑똑한 방법으로 보수를 사용하는 방법이 등장했다. 컴퓨터는 기본적으로 덧셈만 할 수 있다. 그렇다면 뺄셈은 어떻게 할까? 바로 **보수(Complement)**라는 아이디어가 이 문제를 해결한다. 보수를 사용하면 덧셈만으로도 뺄셈을 구현할 수 있다. 보수에는 두 가지 주요 방식이 있다.
1010
→0101
1의 보수는 간단하다. 이진수의 모든 비트를 반전시키는 방식이다. 음수를 표현할 때는 이렇게 반전된 값을 사용한다. 하지만 1의 보수 방식에는 +0
과 -0
이라는 두 가지 0이 존재한다는 문제가 있다. 이로 인해 연산이 비효율적이다.
1010
→1011
2의 보수는 음수를 표현하는 가장 널리 쓰이는 방식이다. 방법은 간단하다. 우선 모든 비트를 반전(1의 보수)한다. 그 결과에 1을 더한다. 2의 보수는 뺄셈을 덧셈처럼 구현할 수 있다는 장점이 있다. 예를 들어 7 - 5
는 7 + (-5)
로 처리할 수 있다. 이 덕분에 컴퓨터는 덧셈기 하나만으로도 뺄셈을 해결할 수 있다.
현대 컴퓨터는 거의 모두 2의 보수를 사용한다. 그 이유는 다음과 같다:
+0
과 -0
같은 애매한 경우가 없다.이진수 또한 십진수와 같이 덧셈과 뺄셈이 가능하다. 덧셈의 경우 우리가 익히 배웠듯이 각 자리의 덧셈 결과가 2가 될 경우 자리올림(carry
)이 일어난다. 그렇다면 뺄셈은? 뺄샘을 한번 살펴보자. 컴퓨터는 뺄셈을 덧셈과 보수 개념을 통해 접근한다. 즉, 양수 - 양수
가 아니라 양수 + 음수
개념으로 인지하는 것이다. 이때 앞에서 살펴본것처럼 음수부를 표현하는 방식이 각기 다르다. (1의 보수, 2의 보수..)
a
에 2의 보수를 취해 음수로 변환('a
).b
+ 'a
를 수행(c
).c
는 음수이며, 2의 보수로 표현되어 있음.+0
과 -0
의 구분이 없어 연산의 일관성이 높다.프로그램이 실행되려면 반드시 (빈칸)에 저장되어 있어야 합니다 혼자 공부하는 컴퓨터 구조+운영체제: 실습 문제 3번 51p
프로그램이 실행되려면 반드시 메모리
에 저장되어 있어야 한다.
1101(2) 의 음수를 2의 보수 표현법으로 구해보세요 혼자 공부하는 컴퓨터 구조+운영체제: 실습 문제 3번 65p
1101(2)의 음수를 2의 보수로 표현하면 0011(2)
이다.
이는 10진수로 -13을 나타낸다.