https://dev-dx2d2y-log.tistory.com/198
[논리회로] 가장 기본적인 논리게이트로 합성하기
https://dev-dx2d2y-log.tistory.com/193 [논리회로] 논리회로 기초 및 AND, OR, NOT 게이트, 논리연산 기초회로 기초간단하기 때문에 디지털시스템에서는 2진 회로(binary circuits)가 주로 사용된다. 입력값은 오
dev-dx2d2y-log.tistory.com
https://dev-dx2d2y-log.tistory.com/200
[논리회로] 카르노 맵과 콰인-맥클러스키 알고리즘
https://dev-dx2d2y-log.tistory.com/198 [논리회로] 가장 기본적인 논리게이트로 합성하기https://dev-dx2d2y-log.tistory.com/193 [논리회로] 논리회로 기초 및 AND, OR, NOT 게이트, 논리연산 기초회로 기초간단하기 때
dev-dx2d2y-log.tistory.com
이제까지는 논리회로의 가장기초가 되는 부분과 논리회로의 합성에 대해서 알아보았다.
이번에는 이제까지 배운 논리회로 내용들을 토대로 논리회로를 통해 숫자를 표현하는 법을 알아보려한다.
무부호 수
무부호 수란 부호가 없는, 그러니까 unsigned 수를 뜻한다. 양수만 표현 가능하다.
진법
간단하게 진법 내용을 정리해보자면, 여태까지는 10진수를 2진수, 8진수, 16진수 등으로 바꿀 때 여러 번 나눗셈을 거쳐야했지만, 실제로는
k0 * r^0 + k1 * r^1 + k2 * r^2 + ... + kn * r^n 으로 나타낼 수 있다. (r이 기수에 해당함)
가령 십진수 5는 이진수로 나타내면 1 * 2^2 + 0 * 2^1 + 1 * 2^0 이므로 101로 표현하는 것처럼. 이는 2진수 뿐 아니라 8진수와 16진수에도 해당하는 사항이다. 또한 16진수에서 0에서 9까지는 10진수와 동일하게, 이후로는 A, B, C, D, E, F로 15까지 표현할 수 있다.

따라서 2진수, 8진수, 10진수, 16진수로 각각 수를 표현하면 이렇게된다. 자세한 내용은 저서 127쪽 참고
컴퓨터에서는 주로 2진수를 사용하고, 8비트와 16비트는 2진수에 대한 속기적 표기로 사용한다. 즉, 2진수를 간결하고 명확하게 표현하기 위함이다. 또한 다른진법들보다 2진수에서의 변환이 훨씬 쉬운 편이기도하다.
예를들어, 이진수 101011010111 (십진수 2775)를 그대로 이진수로 저장하면 복잡하고, 난해한 편이다. 중간에 비트가 소실될 수도 있고.

하지만 8진수의 경우에는 2진수의 비트 세 개를, 16진수의 경우에는 2진수의 비트 네 개를 최하위비트(오른쪽부터, LSB, Least-Significant Bit)에서부터 묶어서 각각 8진수와 16진수에 대응시킬 수 있다. 따라서 2진수 101011010111은 8진수 5327, 16진수 AD7로 더 깔끔하게 처리할 수 있다.
만약 진법처리하다가 자리수가 모자랄 경우 최상위비트(왼쪽부터, MSB, Most-Significant Bit) 왼쪽에다가 모자란만큼 0을 추가해주면 된다.
현대 컴퓨터에서는 2진수를 32비트나 64비트로 처리한다. 즉, 2진수를 32자리나 64자리로 표현하는 셈인데, 이런 구조에서의 수는 길이가 길면 취급하기 어렵다. 따라서 8진수나 16진수의 형태로 짧게 표현할 수 있기에 속기법으로 16진수를 사용하기도한다.
무부호 수의 덧셈1 - 반가산기
이진덧셈은 10진수와 그 매커니즘이 동일하다. 단지 1과 0으로만 수를 표현할 수 있을 뿐이다. 받아올림이 발생하면 윗자리로 1을 넘기고 본인의 자리는 계산결과를 0으로 처리하면 된다. 101 + 001 = 110 과 같이.

1비트 연산부터 알아보자면, 1비트 연산에서는 출력값이 두 개다. 왜냐하면 1 + 1 = 10 이니까 가능한 자리수는 두 자리. 총 두 개의 출력값을 사용한다. 이처럼 다중출력이 되는 경우가 빈번한데, 이 경우에는 그냥 출력결과를 따로따로 계산한 후에 회로를 만들 때 합치면 된다.
진리표를 볼 때 c는 입력변수가 (1, 1) 일 때만 1이므로 AND 연산을 사용하고, s는 (0, 1), (1, 0) 일 때만 1이므로 XOR 연산이다. (XOR은 두 값이 다를 때만 1, XAND는 두 값이 같을 때만 1)

이를 회로로 나타내면 위와 같이 나타낼 수 있으며, 이처럼 단 두개의 비트의 덧셈을 구현하는 회로를 반가산기(half-adder)라고한다.
무부호 수의 덧셈2 - 전가산기
다만 언제나 두 개의 비트만 더할 순 없고, 여러 비트가 있는, 더 큰수를 표현할 때가 있다.

이처럼 각 비트를 더할 때, i번째 자리수는 i-1번째 자리수에서의 올림수를 포함할 수 있다.
이를 회로로 구성하기 위해서는 진리표를 작성할 수 있는데, 문제는 위의 예시에서 각 피연산자는 5개 비트를 사용하고 있다. 따라서 가능한 모든 경우의 수는 2^10개, 즉 1024개다. 따라서 진리표를 작성하기에는 부적합하다.
따라서 각 자리수 별로 덧셈을 나눠서, 그러니까 xi + yi에 대한 덧셈으로 나누어 생각해볼 수 있다.
다시 한 번 생각해보면, 0번째 비트, 그러니까 맨 오른쪽 비트는 어차피 올림수가 발생하지 않으므로 반가산기로 처리가능하다. 그 후, i번째 비트에서는 올림수가 발생할 수 있으므로 반가산기로 처리할 수 없다. 또한 i번째 비트에서는 xi + yi 뿐 아니라 올림수 ci 도 덧셈에 참여한다.
3-변수 정도는 카르노 맵을 통해서 값을 처리할 수 있으므로 계산해보면,

먼저 다음자리수에 영향을 미칠 올림수부터 계산해보면 xiyi + xici + yici 로 계산이 되고, 그 다음에 현재 자리수의 결과가될 si는, 001 010 111 100에서만 결과가 1, 그러니가 홀수 개의 변수가 1일 때 값이 1이다. 이를 XOR 연산으로 칭한다.
XOR 연산은 ~x1x2 + x1~x2 를 XOR 연산이라고한다. 2장에서 했다는데 왜 기억이...
아무튼 ~xi~yici + ~xiyi~ci + xiyici + xi~yi~ci를 3-입력 XOR로 사용할 수 있다. 회로에서는 그러하고, 위에서 말한대로 홀수 개의 입력만이 1일 때 1을 출력하는 게이트이기도하다.

이를 회로로 나타내보면 위와 같다. 이러한 회로를 전가산기(full-adder)라고 칭한다.
XOR회로의 특징은
x XOR y = ~xy + x~y 이므로, x가 0이면 출력은 y (1y + 0~y이므로 y), x가 1이면 출력은 ~y이다.
si의 카르노맵을 보면, 위쪽의 절반은 ci가 0, si는 xi XOR yi 이다. 아래쪽의 절반은 ci가 1, si는 xi XOR yi의 역연산이다. 따라서 위의 예시에서, ci XOR (xi XOR yi) = ~ci(xi XOR yi) + ci~(xi XOR yi)이다. 이 때 ci가 0이면 출력이 xi XOR yi, ci가 0이면 출력이 ~(xi XOR yi)이다. 이는 바로 위에서 말한 XOR 회로의 특징과 일치하며, 바로 위의 예시와도 일치한다. 따라서 직관적으로 ci XOR xi XOR yi를 도출할 수도 있다.
또 ~(xi XOR yi)는 두 값이 일치하지 않을 때만 1을 출력하는 XOR의 역연산이므로 두 값이 일치할 때에만 1을 출력한다. 따라서 이를 XAND라고하며, 기호로는 점 주변으로 동글뱅이를 친 것과 같다.

또한 전가산기는 반가산기 두 개와 OR게이트 한 개로 구현할 수 있다.
반가산기를 통해 xi와 yi를 더하고, 계산결과를 올림수와 한 번 더 반가산기를 통해 더한 값으로 최종 연산값을, 그리고 다음 자리수에 넘겨줄 올림수를 최종적으로 정리하기 위해서 OR 게이트를 사용한다. 두 반가산기 중 어느 한 곳에서라도 올림이 발생했다면 올림수를 다음 연산에 넘겨주는 역할을 한다.
단, 두 반가산기에서 동시에 올림이 1이 발생할 수는 없다. 왜냐하면 두 번째 HA에서 입력값이 둘 다 1이어야하므로 ci = 1, xi + yi 의 s가 1이어야한다. 하지만 xi + yi 반가산기의 c도 1이어야하므로 xi + yi = 11 이라는 결과가 나와야하는데, 이는 논리적으로 불가능하기 때문이다. 1 + 1 = 3이 아니듯이.
그래서 이론적으로나 처음 배울 때에는 반가산기 2개를 통해 전가산기를 배우는 경우가 있지만, 실제로는 위에서 그린 전가산기 회로가 좀 더 빠르고 최적화도 쉬워서 위에것을 사용한다.
리플 캐리 가산기
이제 전가산기를 배웠으니 많은 자리수에 대해서 비트연산을 수행할 수 있다.

위와같이, 오른쪽 회로에서부터 연산이 시작되어, 올림수가 발생하면 이를 다음 전가산기로 넘기는 방식으로 가산한다. 올림수의 '올림'을 '캐리'라고하는데, 이 캐리 신호가 물결(ripple)처럼 다음 가산기로 넘어가기 때문에 이러한 방식을 리플 캐리 가산기(ripple carry adder)라고한다.
각 가산기는 출력 si와 ci+1의 생성까지 약간의 지연 시간을 가지게되는데, 각 입력값들이 전가산기에 들어가고 난 후로부터 지연시간이 지난만큼 다음 가산기에서 연산을 시작한다. 따라서 최종값은 (더하려는 값들의 비트수)*(지연시간)만큼 기다려야한다.
저성능 CPU의 경우에는 전가산기 하나 당 약 10ns ~ 25ns가 소요된다. 현대의 컴퓨터들은 64비트, 32비트 수를 사용하므로 640ns ~ 1600ns 만큼의 수 계산이 필요하다. 즉, 64비트 연산에서는 1+1 계산하는데 최대 1.6㎲가 소요된다.
CPU의 한 클럭은 0.3ns 마다 한 클럭이 작동된다고하면, (3GHz 기준) 5333 클럭이 필요하다. 따라서 현대의 64비트나 32비트 연산을 저성능 CPU의 리플 캐리 가산기에 태우면 형용할 수 없는만큼의 시간지연이 발생한다. 따라서 뒷장에서는 고속가산기에 대해 배워볼 것이다.
설계 예
무부호 8비트 수에 3을 곱하는 회로는?
무부호 8비트 수 A = a7a6a5...a0이라고하고, 계산결과 P = p9p8p7...p0이라고하자.

가장 단순한 방법은 리플 캐리 가산기 두 개를 사용해 자기자신을 두 번 더하면 된다. 첫 번째 가산기에서 A + A = 2A를, 두 번째 가산기에서 2A + A = 3A가 된다.
하지만 이 방식은 느리며, 효율적이지 않다. 3*2 계산하는데 10666 클럭이 소요된다면 나는 그 CPU를 만든 회사를 고소할 것이다.

사실 2A를 만드는, 원래 수에 2를 곱하는 과정에는 약간의 꼼수가 있다. 비트를 왼쪽으로 1만큼 시프트하면 2배가 되는 것. 반대로 오른쪽으로 시프트하면 1/2배가 된다. 따라서 이를 사용해서, 아주 쉽게 2배 처리를하고, 리플캐리가산기는 한 번만 사용할 수 있다.그래서 위의 리플캐리 가산기를 두 개 사용한 예시에서 두 번째 리플 캐리 가산기와 본질적으로 동일한 역할을 수행한다.
부호 수
10진수는 +기호와 -기호를 사용하여 부호를 나타내지만, 2진수에서는 가장 왼쪽비트로 부호를 표현한다. 1이면 음수, 0이면 양수. 여기서 최상위비트 MSB의 위치가 달라지는데, 무부호 수에서는 모든 비트가 수 표현에 참여하므로 MSB가 가장 왼쪽 비트였지만, 부호 수에서는 가장 왼쪽비트가 부호를 표현하므로 MSB는 가장 왼쪽비트의 한 칸 오른쪽에 해당하는 비트다.
보수
1의 보수
n비트 수 P의 음수는 1의 보수를 통해서 구할 수 있다. 음수를 K라고하면,
K = (2^n - 1) - P로 구할 수 있다.
0101인 5를 이진수로 바꾸려면 (2^4 - 1) - 5 = 1111 - 0101 = 1010이 된다. 이를 보면 알 수 있듯이, 1의 보수는 각 비트의 1을 0으로, 0을 1로 바꾸면 얻을 수 있다.
2의 보수

예전에 2의 보수에 대해서 다룬 적이 있는데, 이와 동일하다.
이론상으로는 K = 2^n - P로 구할 수 있다. -5는 10000 - 0101 = 1011이 된다. 다만 이는 윗자리에서 수를 빌려와야한다. 위의 예시를 들면 4비트 수 0101의 음수를 구하려면 5비트로 표현한 10000을 필요로하는 것을 알 수 있다. 즉, 모자란 자리수만큼 어디선가 빌려와야한다.
하지만 K1이 P의 1의 보수, K2가 P의 2의보수라면,
K1 = (2^n) - P
K2 = 2^n - P
이므로 K2 = K1 + 1이된다. 따라서 수를 빌려오려면 4비트 체계를 무너뜨리고 5비트 체계를 사용해야한다는 단점이 있는 반면, 단순히 1의 보수를 구한 후 거기에 1을 더하면 2의 보수를 손쉽게 구할 수 있다. NOT게이트를 사용하면 1의 보수를 구하는 것은 일도 아니므로..
그래서 2의 보수를 구하는 규칙은, P = p(n-1)p(n-2)...p1p0에 대해서 P의 2의보수를 K = k(n-1)k(n-2)...k1k0이라고하면, P의 비트를 오른쪽에서부터 조사한다. 첫 번째로 1이 나오는 비트가 생길 때까지 P를 K에 복사하고, 첫 번째로 1이 나오는 비트가 생기면 그 뒤로부터는 보수를 취한다.
P = 0110이라고하면, 첫 번째 비트는 0이므로 K에 그대로 복사, 두 번째 비트는 1이므로 K에 그대로 복사, 그 이후 비트들은 보수로 K에 복사시켜서 K = 1010을 얻을 수 있다.
이렇게 세 가지 방안이 있다. 빌림수를 사용하는 방법, 1의 보수에 1을 더하는 방법, 수를 오른쪽부터 훑으며 계산하는 방법. 첫 번째는 빌림수가 발생하므로 적절하지 않고, 두 번째는 가산기를 사용해야해서 불필요한 성능저하가 발생하기 때문에 세 번째 방법이 주로 사용된다.
또한 위의 사진에도 나와있지만, 1의 보수 표현에서는 0이 두 가지로 표현된다. 1의 보수 표현에서 0000과 1111 모두 0이다. 하지만 2의 보수법으로 0000을 음수로 바꾸면 그대로 0000이다.
부호 수 덧셈하기
연산자의 부호가 같다면 단순히 두 수의 절댓값을 더하고 부호만 붙여주면되므로 간단하다. 하지만 부호가 다른 경우에는 이 경우에는 부호를 정하기 위해서 두 수의 크기를 비교해야한다. 하지만 두 수를 비교하지 않고 더 간단하게 뺄셈이 가능하다. 따라서 컴퓨터와 논리회로에서는 단순히 절대값을 비교하는 방식으로 부호를 지정하지 않는다.
1의 보수 덧셈

1의 보수는 간단하다. 모든 비트를 반대로 뒤집으면된다. 다만 단점이 있는데, 올림이 발생한다. 0101 + 1101 = 10010이 된다. (5 + (-2) = 18) 올림을 무시하면 결과값이 0010 (2)가 되므로 옳지 않다. 따라서 올림이 발생하면 이 올림수를 LSB에 더한다. 위의 경우에는 0011 (3)이 되기 때문에 맞다.
또한 음수끼리의 덧셈의 경우에도 마찬가지인데, 올림때문에 1010 + 1101 = 10111 (-5 + (-2) = 23)이 된다. 따라서 올려진 수를 LSB에 더해서 1000으로 올바른 값을 구해야한다.
즉, 어떤 경우 덧셈의 과정이 추가로 한 번 더 필요하다는 뜻인데, 따라서 추가적으로 시간이 더 필요하다.
2의 보수 덧셈

2의 보수는 위와 같이 구할 수 있다. 2의 보수 역시 올림이 발생하는데, 이 경우 올림된 수를 무시해도 나머지 결과값이 동일하다.
0101 + 1110 = 10011이지만 올림수를 무시해 0011이된다. 이는 5 + (-2) = 3과 일치.
1011 + 1110 = 11011이고 올림수를 무시해 1011이된다. 1011은 -7이므로 -5-2=-7과 일치.
따라서 2의 보수로 나타내는 과정이 1의 보수보다는 다소 복잡하지만, 2의 보수의 덧셈과정은 1의 보수보다 간단하다.
2의 보수 뺄셈
뺄셈 연산의 가장 쉬운 방법은 뺄 수(감수, subtrahend)를 2의 보수로 바꿔서 기존 피연산자(피감수, minuend)에 더하는 것이다. 5 - 2 연산을 위에서처럼 5 + (-2) 로 바꿔서 연산할 수 있다.
가감산기
이제 논리회로상에서 가감산기를 만들어보자.
뺄셈의 경우에는 2의 보수를 만들어야하는데, 2의 보수를 위해서는 1의 보수에 1을 더할 수 있다.
위에서 리플 캐리 가산기의 맨 처음 입력에 c0가 있는데, 여기에 1을 넣어주면 1의 보수에 1을 더할 수 있고, 1의 보수는 NOT 게이트를 통해서 수행할 수 있다.
하지만, 이는 미리 가산기와 감산기가 분리되어있다. 리플 캐리 가산기에 NOT 게이트를 추가할 수는 없기 때문. 따라서 덧셈의 경우 피연산자의 실제값을, 뺄셈의 경우 2의 보수를 사용하는, 보다 유연한, 한 장치에서 가산과 감산을 모두 처리할 수 있는 회로가 필요하다.
앞서 XOR 연산을 통해서 하나의 입력에 따라 다른 입력값의 실제 값과 보수 값을 조정할 수 있다고했다. 위의 예시에서는 ci 값에 따라서 xi XOR yi 의 값의 보수 여부가 변했다. 따라서 이를 적용시켜보자면 0일 때 덧셈이 일어나도록, 1일 때 뺄셈이 일어나도록하는 제어 신호를 Add/Sub이라고 칭한다. (Add 위에 줄이 그어져있으나 컴퓨터 상에서는 이를 표현할 수 없어서 생략하도록 한다.)

즉, Add/Sub 신호와 더하거나 뺄 수의 각 부호들이 XOR 연산으로 연결되어있다면, 덧셈일 때 (Add/Sub 신호가 0일 때) 더할 수의 값이 그대로 들어가고, 뺄셈일 때 (Add/Sub 신호가 1일 때) 뺄 수의 값이 기존 값의 보수로 들어간다. 2의 보수는 1의 보수에 1을 더해줘야하므로, Add/Sub 신호를 리플 캐시 가산기의 초기입력값 c0으로 넣어주면 된다.
이는 논리회로 설계 시 유의해야할 회로는 가능한 유연하게, 가능한 한 많은 부분을 공통으로 처리해야한다는 점을 보여주는 사례라고할 수 있다.
굳이 중요하지 않은 내용이긴하다만... 10진수도 이와 같은 방향으로 연산을 수행한다.
74 - 36
이 경우는 빌림수를 요하는 뺄셈이다. 따라서
74 -36 = 74 + 100 - 100 - 36
= 74 + (100 - 36) - 100.
100 - 36은 여전히 빌림수를 요하므로
74 - 36 = 74 + (99 -36) + 1 - 100
으로 나타낼 수 있다. 이 방식의 2의 보수 연산과 비슷하다.
(99-36)은 1의 보수를 찾는 과정과 비슷하다. 1의 보수에서는 각 자리수의 비트값만 바꾼다고했지만, 사실은 1에서 각 자리수값을 빼는 것과 동일하다. (1-1=0, 1-0=1) 따라서 위 과정도 9에서 각 자리수를 뺌으로 9의 보수를 구한다.
또 1의 보수에서 2의 보수를 구하기 위해 1을 더한다고했는데, (99 - 36) + 1을 보면 알 수 있듯이 9의 보수에 1을 더해 최종 10의 보수를 구한다. 36의 10의 보수 64.
따라서 10의 보수를 통해
74 - 36 = 74 + 64 - 100 으로 구할 수 있다. 즉, 74와 뺄 수 36의 보수를 더하는 것과 동일하고, 100을 빼는 것은 올림수 무시와 비슷하다.
이러한 방법을 래딕스-컴플리먼트 기법(radix-complement scheme)이라한다. 래딕스는 기수를 뜻하며, 기수에 대한 보수 연산 정도로 보면된다. 2의 보수 연산은 래딕스-컴플리먼트 기법의 한 갈래.
십진수를 이진수처럼 맨 왼쪽값을 부호로 사용한다고 치자.
027 - 045 = 027 + 1000 - 1000 - 045 = 027 + (999 - 045) + 1 - 1000이고,
027 + 955 - 1000 = 982 - 1000 이 나온다.
982 - 1000 은 여전히 뺄셈을 사용해야한다.
하지만, A - B에서 A - B = M - 10^n 이라고 가정할 때, A >= B라면 M > 10^n이므로 그대로 연산을 진행하면되지만, B < A일 때는 M < 10^n이다.
A - B = M - 10^n을 재구성하면 10^n - (B - A) = M이고, 결국에는 M은 (B - A)의 10의 보수다. 이에 따라
982 = 1000 - (A - B)이고, 982는 A - B를 보수형태로 만들 때의 결과인 음수다. 따라서 982의 10의 보수는 18이므로 결과는 -18. 따라서 래딕스-컴플리먼트 기법을 사용하여 뺄셈연산을 사용할 수 있다.
n자리에서 N에 대한 기수 r의 보수는 r^n - N으로 나타낸다. 그리고 r - 1의 보수는 (r^n-1) - N이다. N의 각 자리에 대해서 r - 1의 값에서 각 자리 값을 빼면된다. 예를들면, 위의 10진수의 래딕스-컴플리먼트 기법에서 9의 보수를 구하는 과정은 99 - N을 통해서 쉽게 구할 수 있었고, 2진수의 연산에서는 단순히 1의 보수를 구할 수 있으므로 이 과정이 더 쉽다. 이 때 r-1의 보수를 디미니시드 래딕스 컴플리먼트 (diminished-radix complement)라고 칭한다.
오버플로 감지하기
오버플로우 문제는 이전에도 다룬 적이 있어서 넘어가고, 이 오버플로를 감지해내는게 문제다.
가산기를 사용하면 c와 s가 나오는데, 부호비트 연산에서 발생한 c값과, MSB에서 발생한 c 를 조사하면 된다.

오버플로가 발생했다면 MSB와 부호비트에서 발생한 c값 (캐리 아웃)이 다른 값을 가진다. 왜냐하면 오버플로는 부호가 같을 때의 연산에서만 일어나는데,
양수 + 양수의 경우 MSB의 연산에서 캐리아웃이 1로 계산되어 부호비트로 넘어갔을 때, 부호비트의 캐리아웃이 0이라면 올림수가 발생하지 않았단 뜻이고, 결국 결과값의 부호비트가 MSB에서의 캐리아웃 1이 될 것이므로 양수 + 양수가 음수가 나와 오버플로가 발생했다.
음수 - 음수의 경우 MSB의 연산에서 캐리아웃이 0으로 계산되어 부호비트로 넘어갈 때, 부호비트의 캐리아웃이 1이라면 연산결과가 10이 되어 결과값의 부호비트가 0, 캐리아웃이 1이 된 것이므로 결과값이 양수가된다. 즉, 음수 - 음수가 양수가 되어 오버플로 발생.
양수 - 음수에서는 오버플로가 발생하지 않고, 양수 + 양수를 했는데 너무 큰 값을 더해버려서 지나친 오버플로우로 인해 양수가 되려면 이미 피연산자에서 오버플로가 발생한 것이므로 성립하지 않는다.
아무튼 MSB의 캐리아웃과 부호비트에서의 캐리아웃의 값이 같은지 여부만 조사하면 되는데, 이는 XOR 게이트로 검사할 수 있다.
암튼 이렇게 감가산기에 대해서 알아보았는데, 일반적인 컴퓨터에서는 부호 수와 무부호 수는 같은 가산기 회로를 사용한다.
https://dev-dx2d2y-log.tistory.com/188#%ED%94%8C%EB%9E%98%EA%B7%B8-1-1
[컴퓨터구조] 혼공컴구 독서 #3 - CPU - ALU, 플래그, 제어장치
https://dev-dx2d2y-log.tistory.com/185 [컴퓨터구조] 혼공컴구 독서 #2 - 명령어혼공컴구 책을 쭉 보니까 책 앞부분이 데이터와 명령어를 다루고 있다. 그런데 데이터는 이진수로 숫자와 문자를 표기하는
dev-dx2d2y-log.tistory.com
예전에 컴구 기초를 다루며 플래그 비트 중 캐리플래그(CS)와 오버플로플래그(OF)가 있다는 것을 배웠는데,
캐리아웃 플래그는 unsigned 연산에서 표현가능한 수 범위를 벗어났다는 것을 알리는 것이고, signed 연산에서는 캐리아웃이 일어나더라도 기본적인 연산과정에서 캐리아웃을 동반할 수 있어 오버플로우용 신호를 따로 알리는 것이다.
따라서 부호 수와 무부호 수 범용 가산기는 캐리아웃 신호와 오버플로 신호를 같이 표시할 수 있어야한다.
'CS > 논리회로' 카테고리의 다른 글
| [논리회로] 캐리 예측 가산기 및 곱셈기 (2) | 2026.02.02 |
|---|---|
| [논리회로] 카르노 맵과 콰인-맥클러스키 알고리즘 (0) | 2026.01.30 |
| [논리회로] 가장 기본적인 논리게이트로 합성하기 (1) | 2026.01.26 |
| [논리회로] 논리회로 기초 및 AND, OR, NOT 게이트, 논리연산 기초 (0) | 2026.01.24 |
