2진수
정의)기수가 2인 수로 0,1으로만 표현된다(기수란? 수를 나타내는 기초가 되는 수)
ex)1010.1011(2) *(2)는 아래 첨자임
1x2^3 + 0x2^2 + 1x2^1 + 0x2^0 + 1x2^(-1) + . ... .
어려운건 10진수 -> 2진수 변환인데 방법으로는,
1. 정수부분의 나머지와 소수부분의 정수를 적어내려감
2. 정수부분의 나머지가 0, 소수부분의 정수가 0이 될때까지 반복
10진수 -> 8진수 or 16진수 변환이 있는데, 이거는 10진수 -> 2진수로 변환해서 바꿔도 문제 x 8or16진수 변환이 더 쉽고 빠르다면 상관없음
2진수 양의 덧셈
2진수는 수의 체계가 0과 1로만 이루어져있기 때문에, 1+1=2가 아닌, 1+1 = 10이 됨
why? 1을 2진수로 4bit 내에서 나타내면 0001이고, 2는 0010이기 때문에
0001 + 0001 = 0010이 되는 것
-> 1+1을 통해, 자리가 바뀌는 것을 carry가 발생한다고 이야기 함
2진수 뺄셈
2진수 덧셈이 가능하기 때문에, 뺄셈도 가능하나 뺄셈을 구현하기 위해 다른 수를 사용함
why? 컴퓨터는 애석하게도 음수를 알아듣기 힘들어 함..
2진수를 음수로 표현하는 방법은 3가지가 있음
1) 부호와 절대치
2) 1의 보수
3) 2의 보수
1)부호와 절대치
맨 왼쪽에 놓여있는 비트를 최상위 비트 MSB( Most Significant Bit )라고 칭하는데,
맨 왼쪽의 비트가 0이면 이하 7자리 비트가 나타내는 수를 양수(+)로 나타내고,
1이면 음수로 나타냄
ex)0001 = 1, 1001 = -1
최상위 비트를 부호 비트로 사용해야하기 때문에 값의 범위가 감소한다
<1의 보수와 2의 보수>
보수란?
보충을 해주는 수로, 한정된 비트를 사용하는 이진수는 보수를 이용해서 음수를 표현할 수 있기 때문
1의 보수는 기존 비트를 뒤집고, 2의 보수는 1의 보수에서 1을 더함
ex)00001111의 1의 보수 : 11110000 2의 보수 : 11110000+00000001 = 11110001
1의 보수와 2의 보수 또한, 최상위 비트를 부호 비트로 가지며 대칭성을 가지고 있음
<보수의 일반화>
r진법 n자리수 x의 r-1의 보수 : r^n - 1 -x
r진법 n자리수의 x의 r의 보수 : r^n -x
뭔 소린지 모르겠다면 정상이다
예를 들어, 354라는 숫자의 보수는 10진법 4자리수에서 자기자신을 뺀다면 보수가 나옴
10진법 4자리수 = 1000
ex ) 1,000 - 354 = 646
이를 354의 10의 보수라고 이야기하며, 354의 9의 보수는 여기서 -1을 뺀, 645가 됨
다시 돌아와서, 2진법 내에서 보수를 구할 때,
00000011이라는 숫자의 1의 보수와 2의 보수를 구한다고 하면
1의 보수
2^8 -1 - 00000011
= 1111 1111 - 00000011 = 1111 1100
2의 보수
2^8 - 00000011
1 0000 0000 - 00000011 = 1111 1101
7928 - 879를 계산한다고 했을 때, -879 대신 879의 보수 (10^4 - 0879)를 -879대신 대입한다
7928 + (10^4 - 0879) = 17049
이때, Carry가 발생했기 때문에 1을 빼면 7049라는 값이 도출됨
Q. 8비트로 표현된 어떤 수 A를 2의 보수로 변환하였다. 이때 변환한 결과를 B라고 했을 때, A와 B의 합은?
2^8 - A = B
A + B = 2^8
q. 8비트 메모리 워드에서 비트 패턴 11101101(2)은 (a)부호와 절대치, (b)부호와 1의 보수, (c)부호와 2의 보수로 해석될 수 있다. 각각에 대응되는 10진수를 구하시오,
최상위비트를 제외한 비트 패턴 값은 2^0 + 2^2 + 2^3 + 2^5 + 2^6 = 109
부호와 절대치에서 최상위비트가 음수를 만들기 때문에 (a)-109
부호와 1의보수는 1의 보수를 먼저 구한다 11101101 -> 00010010 -> 18인데 앞서, 최상위비트가 1을 가리키고 있었기 때문에 (2)-18
부호와 2의 보수는 1의 보수값에 +1을 하고 부호 반전을 시켜주면 됨 (3)-19