컴퓨터는 기본적으로 모든 데이터를 이진 데이터로 인식하고 계산하고, 문서 작업을 해야하고, symbols이라는 특수 경우를 처리해주어야하고, 데이터 처리를 이진 방식을 이용한다.
어떻게 숫자를 표현하고, 연산을 수행하고, 어떻게 글자를 표현하고, 데이터 전송 등등을 배울 예정
Number System
숫자는 컴퓨터가 인식할 수 있는 이진수가 있고, 사람이 가장 잘 이해할 수 있는 10진수, 8진수 등등 많은 표현 방법이 존재한다. 왜 이렇게 많은 경우가 존재할까? 각 진수가 시스템마다 요구하는 데이터를 표현하는 최적화된 방법이 될 수 있기 때문에(conversion) 각 진법변환은 모든 자리마다 가중치가 존재함.
8비트로 표현된 수를 2진수로 표현하기 : 이진수로 표현된 수들을 8비트로 변환하려면 3비트씩 잘라서 계산하면 된다.
16비트로 표현된 수를 2진수로 표현하기 : 이진수로 표현된 수들을 16비트로 변환하려면 4비트씩 잘라서 계산하면 됨.
소수점을 포함하고 있는 10진수를 2진수로 표현하기 : 정수 파트 / 소수 파트로 나눈 후 각각 변환을 수행한 후 붙여주면 된다. 소수 부분은 1.0이 될 때까지 2를 곱해준다. 그리고 위에서 정수 부분들을 붙여주면 2진수로 변환한 값이 된다.
0-9까지 사용하는 10진수를 2진화 10진수로 변환하는데 4비트로 이용한다. 4비트로 이용하게 되면 안쓰는 부분도 발생한다. 왜냐면 0은 0000으로 표현하면 9는 1001이다. 그런데 10진수는 0-9까지 사용 하므로 그 외에 다른 조합들, 예를 들어서 1001그 이후 것들은 우리는 사용하지 않는다. 따라서 6개의 코드는 BCD에서 사용하지 않는다.
BCD코드를 왜 사용하느냐?
① 변환 시켜주기가 쉽다.
② BCD코드로 변환된 것을 이용해 연산작업을 한 다음에 다시 10진수로 변환해주기가 쉽다.
ex) 전자계산기
ASCll Code : 국제 표준화가 된 영어
- 데이터로 취급되는 문자, 기호도 코드화, 7비트로 영어 대/소문자, 특수기호, 숫자 모두 표현 가능
숫자일 경우 상위 3비트 011을 제외하면 BCD와 같다.
한글은 유니코드, KS완성형 등 사용
보통 컴퓨터에서 더하기 연산은 쉽게 되지만, 빼기는 쉽게 하지 못한다. 그래서 각 수의 보수를 구한 다음 더하기 연산을 수행한다. 보수의 종류는 2가지
1. (r-1)의 보수 , (r-1)은 진수
2. r의 보수
r-1의 보수는 (r^n-1) - N로 정의가 되어있다. r은 진수, n은 자릿수, N은 주어진 숫자
r의 보수는 ((r^n-1) - N)+1로 정의,
10진수를 사용하는 경우
r = 10, 9의 보수를 구하는 경우
N = 12389, r = 10, n = 5자리 -> (10^5-1) - 12389 = 99999 - 12389 = 87610이 9의 보수
1의 보수를 구하는 경우
- 가장 쉬운 방법은 0은 1로 1은 0으로 변환
r의 보수) 만약 r이 10이라고 하면 10의 보수, r이 2라고 하면 2의 보수를 구하는 것
주어진 식은 {(r^n-1)-N}+1
10의 보수 구하기 (2진수 쉬운 방법)
오른쪽 끝에서부터 시작해서 0이 나오는 것들은 모두 통과하고, 첫 번째 0이 아닌 1이 나오면 그대로 둔다. 그리고 그 이후의 수들은 모두 0은 1로, 1은 0으로 변경해준다.
* 소수점을 가진 숫자 N의 보수
Subtraction of Unsigned Numbers -> 양수 - 양수
뺄 셈의 결과값이 양수가 나올 수도 있고, 음수가 나올 수도 있다. 이것을 어떻게 처리하는지 보자.
① M + (N의 r의 보수값) 을 했을 경우 올림수 값이 존재한다는 것은 M값이 N값보다 크고 결과값이 양수를 의미하고, 올림수값을 버리고 남은 값들이 답이 된다.
② M + (N의 r의 보수값) 을 했을 경우 올림수 값이 존재하지 않는다는 것은 N값이 더 크고 결과값이 음수를 의미하고,
그 결과 값에 한 번 더 r의 보수를 취한 후 -를 붙여준 값이 답이 된다.
위 13250의 10의 보수를 구하면 오른쪽 끝에서부터 0은 지나치고 0이 아닌 처음 수가 5이다. 따라서 10에서 5를 뺀 값을 그 자리에 치환하고, 나머지 값들은 9에서 각 자리값들 뺀 값들로 치환해준다. 그렇게 되면 86750이 10의 보수가 된다.
Fixed-Point Representation - 소수점의 위치가 고정되어있는 경우
맨 왼쪽의 비트값을 사용을 해서 Sign비트로 표현한다. 0이면 양수, 1이면 음수
수를 표현하는 3가지 방법
- signed-magnitude (맨 왼쪽 Sign만 변경)
- signed-1's complement representation (1의 보수)
- signed-2's complement representation (2의 보수)
빼기 연산은 signed-2's complement방법을 많이 사용한다.
0도 +0, -0이 존재할 수 있다. 세 가지 방식에서 +0은 모두 같다. -0은 다르다.
표현할 수 있는 수의 범위
8비트로 표현 할 때 최대값은 세 가지 방법 모두 +127로 같지만 최소 값은 signed-2's compl이 -128로 더 작은 값을 표현 할 수 있다. -128을 어떻게 찾을 수 있을까, +128이 존재한다면 2의 보수를 통해 구할 수 있지만 +128이 없기 때문에 다른 방법으로 구해야한다.
일단은 어떻게 더하기와 빼기가 실행되는지부터 보자.
일단 음수인 것은 2의 보수를 구하고 서로 더한다. 올림값이 나오면 버린다, 그 값이 올림값이 없다? 그 결과값이 음수이므로 2의 보수를 한 번 더 취해줘야 찾을 수 있다.
예제 한 번 직접 해보기.
Overflow
ex) 2개의 숫자를 서로 더하려한다. n비트짜리 수 하나와 또 다른 n비트짜리 수 하나를 더하겠다하면 n비트짜리 레지스터에 넣어놓고 또 다른 n비트짜리 레지스터에 다른 수를 넣어두고 연산작업을 진행한다. 이렇게 할 경우 n+1비트짜리 올림수값이 발생할 수도 있다. 그 결과는 n비트짜리 레지스터에 넣을 수 없어 Overflow가 발생한다.
Overflow 발생 여부는 sign bit(즉, 맨 왼쪽) 위치로 들어오는 carry값과 그 자리에서 발생하는 carry값을 XOR를 취했을 때 1이 나온다면 Overflow가 발생한다고 볼 수 있다.
연산을 수행 할 때 sign bit가 다른 2개의 수를 연산한다면 절대 Overflow가 발생하지 않는다.
(sign bit가 다르다? 두 수의 부호가 서로 다르다) 하지만 sign bit가 같은 두 수를 연산할 경우 Overflow가 발생할 수 있다.
Decimal Fixed-Point Representation : 소수점 위치가 정해져있는 10진수
BCD자체에서 연산작업 수행 가능, 하지만 BCD로 수를 변환하게 할 경우 2진수로 했을 경우보다 비트수가 더 클수가 있다. 위 예시 4385
BCD에서는 안쓰는 코드들이 존재한다.
BCD에서도 양수와 음수를 4비트로 표현해준다. 양수면 0000, 음수면 1001
375 + (-240)
375는 양수이므로 (0000 0011 0111 0101)bcd로 표현
-240은 음수이므로 10의 보수를 먼저 구해주고 (0은 지나가고 4는 10-4이므로 6, 2는 9-2해서 7, 즉 760)
에 앞에 bcd는 1001을 붙이므로 (1001 0111 0110 0000)bcd가 된다. -> 9760
이 값들을 서로 더할 때 2진수를 더하듯이 sum, carry방식으로 하지말고(이건 뒤에서 배운다고함, 별도로 존재한다고함) Sign을 포함한 수의 표현으로 해준다.
0 375 + 9 760 = 0 135