이번 학기 전공선택 과목 중 하나로 "논리설계"를 듣게 되었다. 와!
컴퓨터 및 회로에서 받아들이는 논리를 설계하는 법을 배우는 과목이라, 주로 비트의 표현이나 기본 논리회로를 배운다. 전자회로,물리, 수학 쪽을 좋아해서 그런지 재밌게 배우고 있다. 그리고 정보처리기능사 공부했을 때 배웠던 것들이라 한결 쉽게 다가왔다.
오늘 정리해볼 내용은 Signed Binary Number에 관한 내용인데, 처음 이진수 표현이나 진법 변환을 배우게 되면 아마 이 부분이 가장 헷갈리지 않을까 싶다.
1. Signed Binary Number란?
Signed - 부호가 있는(반대는 Unsigned, 즉 양수만 표현한다는 뜻)Binary - 2진수Number - 숫자
즉, 부호도 표현 가능한 2진수 숫자를 말한다.
2. Signed Binary Number 로 표현하는 두 가지 방법
1) Sign, Magnitude (부호부와 숫자부로 구성하여 수를 표현)2) Sign + 2's Complement Number (부호부와 2의 보수로 수를 표현)
+) 2의 보수란?
2의 보수(--補數, 영어: two's complement)란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수보다 한 자리 높고 가장 높은 자리가 1이며 나머지가 0인 수에서 주어진 수를 빼서 얻은 수가 2의 보수이다. 혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤 여기에 1을 더하면 2의 보수를 얻을 수 있다.
이진법 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 이진법(二進法, binary)은 두 개의 숫자(1과 0)만을 이용하는 수 체계이다. 관습적으로 0과 1의 기호를 쓰며 이들로 이루어진 수를 이진수라고 한다. 이진법은 라이
ko.wikipedia.org
라고 하네요~
사실 저 정의를 다 알 필요는 없고, '비트 반전, 그리고 1을 더한다' 만 알면 2의 보수 만드는 법은 매우 쉽게 알 수 있다. 1의 보수는 더 쉽게 구할 수 있는데, 거기서 1을 더하면 2의 보수가 됩니다.
2-1. Sign/Magnitude
SBN(이하 Signed Binary Number)를 표현하는 첫 번째 방법으로는 부호부와 숫자부로 나타내는 방법이 있다. 직관적이고 단순하지만 그만큼 표현상의 제약이나, 메모리를 잡아먹는다는 단점이 있다.(그렇게 크게 잡아먹는 건 아니지만...)
MSB(최상위비트, 쉽게 말해서 가장 왼쪽 비트를 말함)가 부호를 나타내는데 Positive Number는 0, Negative Number는 1로 나타낸다. 그러면 여기서 문제가 발생하는데...
0을 두 가지로 표현하게 된다!
만약 4-bit 라고 가정하면, 1000과 0000 모두 0을 나타내게 되어서, 같은 숫자를 나타내는 데 2개의 표현법이 쓰이는 만큼 메모리가 낭비된다. 반대로 말하면 2-1의 표현법은 다른 표현법보다 표현 가능한 수가 하나 적다.(0에 두 개나 할당하니까)
또 문제가 하나 더 있는데, 바로 Signed지만 Addition이 제대로 기능하지 않는다. Overflow가 발생하면 덧셈을 제대로 계산할 수 없다.
가령, 4비트로 표현한 -6과 6의 덧셈을 보면
-6(in decimal) = 1110(in binary)
+6(in decimal) = 0110(in binary)
1110+0110 = 10100(overflow 발생, 부호부 1에 숫자부 110이므로 -6을 나타냄, 오류!)
덧셈이 제대로 작동하지 않음을 알 수 있다.
2-2 Sign/2's Complement Number
2-2의 경우도 2-1과 마찬가지로 MSB가 Sign을 나타낸다. 그런데 차이점이라고 한다면, 음수를 2의 보수를 활용하여 나타낸다. 2의 보수 표현법은 다음과 같다.
1) 양수 2진수로 나타내기
2) 양수 2진수에서 부호를 모두 반전하기
3) 2)에 1을 더하기
예를 들면 아래와 같다.
-5(in decimal) to binary 2's complement number(4bits)
5=0101, 0101을 비트 반전하면 1010, 1010에 1을 더하면 1011
즉, -5는 1011로 나타낸다.
2-2가 유리한 이유?
2-1에서는 overflow의 발생으로 인해 덧셈이 제대로 작동하지 않았다. 다만, 2-2의 경우는 더하는 숫자의 부호가 다르다면 overflow를 걱정하지 않아도 된다. MSB를 제외한 비트를 숫자부로 보면 덧셈이 성립하기 때문이다.
예시)-2와 3의 덧셈
-2(in decimal) = 0010->1101->1110(in binary)
3(in decimal)= 0011
1110+0011=10001
10001에서 MSB를 제외하면 숫자부는 0001이 된다. -2+3=1이므로, 0001과 일치함을 알 수 있다.
Carry(비트 올림) 을 무시해도 결과값이 제대로 나오므로, 2-1보다 2-2를 사용하는 경우가 많다.
'CS Study' 카테고리의 다른 글
| C++ 기초문법 3) 조건문 (0) | 2023.05.14 |
|---|---|
| C++ 기초 - 입력 및 사칙연산 (0) | 2023.05.07 |
| C++ 기초 : 출력 (0) | 2023.05.07 |
| 파이썬 (Python) - sys.stdin.readline() 과 input(), input()이 시간 초과의 원인 (0) | 2023.04.13 |
| 파이썬 자주 쓰는 함수 정리 (0) | 2023.04.02 |