CS/Computer Architecture

정수를 비트로 표현하는 방법

정요한 2022. 2. 11. 20:43
2진수

우리는 보통 10진수를 사용하지만 컴퓨터의 경우는 0과 1로만 동작하기 때문에 우리가 알고있는 수를 컴퓨터로 동작하게 하려면 이진법으로 바꾸어 주어야 한다. 단순 변환의 경우 간단하게 할 수 있지만, 음수라는 개념이 컴퓨터에는 없고, 또한 데이터가 차지할수 있는 공간이 제한적이기 때문에 발생하는 문제들이 있다. 그것에 대해 정리해보고자 한다.

  • 2진수의 양의 덧셈

    덧셈의 경우 LSB(가장 작은 유효 비트) 부터 시작하여 합이 2 이상일 경우 한칸 MSB(가장 큰 유효 비트)쪽으로 이동하며 자리를 올려준다. 그런데 만약 4비트인 수 1111과 0001이 더한다면 올려줄 자릿수를 초과하는데 이때 상태 레지스터에 MSB로부터의 올림값이 들어가고 값은 0000이 나오고, 오버플로우가 발생한다고 판단한다.. 해결방법은 할당 메모리를 늘려주는 수 밖에 없는듯 하다.

  • 2진수의 음의 덧셈

    실제로 계산할때 음수를 사용해야 하는 경우가 많으므로 음수 개념이 없는 컴퓨터로 어떻게 음수에 대한 연산을 할지에 대한 아이디어가 몇가지 있다.

    1. 최상위비트에 부호를 표시하여 양수면 0, 음수면 1 이런식으로 4의경우 011, -4의 경우 111 로 표시하는 가장 간단한 방법이 있으나, 쓰이지 않는다. 첫째로는 비트 구성에 있어 비용이 추가적으로 발생하고, 둘재로는 XOR과 AND를 통한 덧셈 계산을 할 수 없기 때문에 사용하지 않는다.

    2. one's complement(1의 보수) 개념을 이용하여 하는 방법이 있는데, 모든 비트에 not 을 해주어서 음수를 표기하는 방법이다. 예를 들어 1이 0001이라면 -1은 1110이다. 이 방법에 약간 애매한 점을 예를 들어 설명해 보자면, 만약 2와 -1의 덧셈을 할때, 0010과 1110을 더한다면, MSB에서 올림이 발생하기 때문에, 0000이 되어버린다. 이런 경우 LSB로 올림을 전달해주는 순환올림이라고 불리는 것을 해주어야 하는데, 계산후에 다시 조건에 의해 값을 추가해 주어야 해서 좋다고 볼 수는 없을것 같다. 또한 0을 표현하는 방식이 2가지라서 비효율적이기도 하다.

    3. 다음으로 two's complement(2의 보수) 개념을 이용하는 방법인데, XOR과 AND연산만으로 덧셈을 하는 경우, +1을 하였을때 0이 나오는 패턴을 찾고 이 패턴을 -1이라고 칭한다. 이렇게 되면 추가로 무엇을 해줄 필요 없이, 덧셈으로 과정이 끝나게 되고, 0을 표현하는 방법도 한가지라서 가장 널리 쓰이는 방법이라고 한다. 쉽게 2의 보수를 통해 덧셈을 하는 법은 모든 비트에 not을 한 뒤, LSB에 +1을 해주어서 연산하는 방법이다.