티스토리 뷰
[논리회로] 컴퓨터가 음수를 표현하는 법, Sign Extension, Overflow, 곱셈과 나눗셈 하기
SweetDev 2018. 10. 8. 13:01오래전부터 사람들은 컴퓨터로 음수를 어떻게 표현할까 고민해왔다. 그래서 나온 제일 대표적인 세 방법!
8-bit unsigned int를 예시로 설명한다.
1) 부호-절댓값 방식(sign-magnitude)
부호-절댓값 방식은, 8비트 중 제일 왼쪽 1비트를 부호를 표현하는데 쓰고(0: 양수, 1: 음수), 나머지 7비트로 값을 만든다.
장점: 직관적이다
단점:
1) 양수와 음수를 더했을 때, 값이 옳지 않다. 즉, 뺄셈을 할 수 없다. +5랑 -5랑 더하면, (1000 0101 + 0000 0101 = 1000 1010)으로 -10이 된다..!
2) +0, -0이 생긴다. (1000 0000, 0000 0000 둘 다 0이다) -> 숫자 하나를 더 표현할 기회를 낭비한다..!
2) 1의 보수 방식(1's complement)
1의 보수 방식은, 음수는 양수에다가 전체 비트 inverse를 씌우는 방식이다!!
장점: 계산이 편하다
단점: 역시 +0, -0이 생긴다. 왜냐면, +5 + -5 = 0000 0101 + 1111 1010 = 1111 1111 이여서,
0000 0000 = +0, 1111 1111 = -0이다. 이 역시 숫자 하나를 더 표현할 기회를 낭비한다..!
3) 2의 보수 방식(2's complement)
음수는, 양수 비트를 inverse 한 다음 1을 더해서 음수를 만드는 방식이다.
현대에서는 이 방식을 대부분 사용하고 있다.
-128 ~ 127까지 표현할 수 있다.
제일 첫번째 비트가 1이면 무조건 음수이다.
-2^7, 2^6, 2^5,..., 2^0이라고 생각하자.
특징) x'을 x의 inverse bit라고 하면
x+ x' = -1
x' + 1 = -x
Sign Extension
char에 저장된 음수를 int에다가 옮겨준다면? 24개의 비트가 새로 생긴다. 이 새로 생긴 비트들을 음수면 1로, 양수면 0으로 새로운 비트들을 채워준다.
Overflow
[더하기]
두개의 양수를 더해서 젤 왼쪽의 bit가 1이면 overflow가 난 것이다.
두 개의 음수를 더해서 젤 왼쪽의 bit가 0이면 overflow가 난 것이다.
[빼기]
양수에서 음수를 뺐는데 젤 왼쪽의 bit가 1이면 overflow가 난 것이다.
음수에서 양수를 뺐는데 젤 왼쪽의 bit가 0이면 overflow가 난 것이다.
C언어 같은 언어들에서는 overflow를 아예 무시해버리므로 프로그래머가 잘 관리해야 한다..!
곱셈
이 그림은 실제로 32bit의 곱셈을 해주는 회로이다!
32bit * 32bit => up to 64bit
Optimized Multiplier
이렇게 해도 너무 느려! too expensive! 그래서 만들어진게...
Faster Multiplier
나눗셈
n-bit의 값을 나누면, n-bit의 몫과 나머지가 나온다.
나눗셈을 할 때는 나눌 숫자와 나머지의 부호가 같아야 한다.
Optimized Divider
Multiplier랑 Divider랑 모양이 같으니까! 사실 하드웨어도 공유해서 쓴다고 한다...
Signed Integer에 대해서 Bit Shift로 Divide 하기
i bit로 우이동 하면 2^i로 나눠지는건 unsigned integer에만 해당하는 일이다.
음수라서 왼쪽을 1로 채우면 될것같았는데
-5 / 4 해보니까 -2가 나왔다. 틀림..!
Floating Point 표현하기
IEEE Std 754-1985에서 사용하는 방식이다
표준은 지키는게 좋다!
두개의 표현 방식이 있는데,
1) Single Precision ( 32-bit ) : float in C
2) Double Precision ( 64-bit ) : double in C
'OS > ComputerArchitecture' 카테고리의 다른 글
[ComputerArchitecture] RISC vs CISC (0) | 2021.09.10 |
---|---|
[ComputerArchitecture] Performance 평가하기 (0) | 2021.09.10 |
[ComputerArchitecture] Moore's Law (0) | 2021.09.10 |
[ComputerArchitecture] 배우게 될 중요한 개념들 (0) | 2021.09.10 |
[ComputerArchitecture] ISA란?, MIPS로 코드 짜기 (2) | 2021.09.03 |