본문 바로가기
IT

컴퓨터의 정수 표현

by EDMBLACKBOX 2020. 12. 5.
728x90

컴퓨터의 정수 표현

우리가 사는 현실에서는 정수를 표현할 때 자릿수에 제한을 받지 않지만 기억공간이 제한된 컴퓨터에서는 N개의 비트를 사용해 2N개(0~2N-1)의 정수를 표현합니다.

수학에서는 양의 정수를 표현할 때 + 기호를 붙이지 않아도 양의 정수로 간주합니다. 반면 음의 정수는 반드시 - 기호를 붙여 사용합니다. 즉 양의 정수 5는 +5나 5를 모두 허용하지만, 음의 정수 5는 반드시 -5로 표시해야 한다는 것입니다.

 

보수
보수(Complement)란 진법의 밑수에서 해당되는 수를 뺀 나머지를 의미합니다. 컴퓨터 내부에서는 사칙연산을 수행할 때 덧셈을 담당하는 가산기(Adder)를 이용하므로, 뺄셈은 덧셈 형식으로 변환해야 합니다. 즉 A-B는 우선 B의 보수인 -B를 구한 후 A+(-B)를 수행합니다. 이와 같이 음의 정수를 표현하기 위해 고안한 개념이 보수입니다. 2진법에는 1의 보수와 2의 보수가 있습니다.

1의 보수
각 자릿수가 모두 1로 된 값에서 주어진 2진수의 각 자리의 수를 빼면 1의 보수를 얻을 수 있습니다. 예를 들어 2진수 1010의 1의 보수는 0101(2)입니다. 일반적으로 1의 보수는 주어진 수의 0은 1로, 1은 0으로 바꾸면 됩니다.

 

2의 보수
2의 보수는 1의 보수에 1을 더한 것과 같습니다. 예를 들어 2진수 1010에 대한 2의 보수를 구하려면 먼저 2진수 1010에 대한 1의 보수 0101을 구합니다. 그다음 1의 보수 0101에 1을 더하면 2의 보수 0110(2)을 구할 수 있습니다.

 

고정 소수점 표현
고정 소수점(Fixed point)은 소수점이 고정된 위치에 있다는 뜻이지만, 레지스터 내부에 실제로 소수점이 존재하지는 않습니다. 따라서 수의 왼쪽에 소수점이 있다고 가정한다면 소수를 나타낸 것이고, 오른쪽에 있다고 가정한다면 정수를 나타낸 것입니다. 고정 소수점 방식은 매우 큰 수나 작은 수의 표현에 한계가 있기 때문에 주로 정수 표현에 사용합니다.

고정 소수점 표현

위의 고정 소수점 표현에서 부호(S) 비트가 0이면 양의 정수, 1이면 음의 정수를 나타내며, 크기(Magnitude) 부분은 2진수 정수 값을 나타냅니다. 아래 이미지(양의 정수 표현과 음의 정수 표현)는 양의 정수와 음의 정수를 표현하는 방식을 보여줍니다. 고정 소수점 표현에서는 음의 정수를 표현하기 위해 부호화 절댓값(Signed-Magnitude) 방식, 1의 보수(1's Complement) 방식, 2의 보수(2's Complement) 방식을 사용합니다. 부호화 절댓값 방식에서 최상위 비트(맨 왼쪽 비트)는 부호를, 나머지 비트는 2진수의 절댓값을 나타냅니다. 1의 보수 방식은 음수를 나타내기 위해 부호 비트 1과 2진수의 절댓값에 대한 1의 보수를 사용합니다. 2의 보수 방식은 1의 보수에 1을 더해 음수를 나타냅니다.

양의 정수 표현
음의 정수 표현

 

예를 들어 8비트로 양의 정수 +13과 음의 정수 -13을 나타내면 아래의 표와 같습니다. 이때 최상위 비트(맨 왼쪽 비트)는 부호 비트이고, 소수점은 맨 오른쪽에 위치한다고 가정합니다.

부호화 절댓값 방식과 1의 보수 방식은 부호 비트를 뺀 나머지 비트로 수를 표현하기 때문에 N비트로 표현할 수 있는 수의 범위는 -(2N-1-1) ~ (2N-1-1) 입니다. 반면 2의 보수 방식은 +0과 -0이 존재하는 부호화 절댓값 방식 및 1의 보수 방식과 달리 -0이 존재하지 않습니다. 즉 음의 정수를 하나 더 표현할 수 있으므로 2의 보수 방식으로 표현할 수 있는 수의 범위는 -2N-1 ~ (2N-1-1) 입니다. 대부분의 컴퓨터에서는 2의 보수 방식을 사용하고 있습니다. 아래의 표는 3비트로 표현할 수 있는 수의 범위를 나타낸 것입니다.

3비트로 표현할 수 있는 수의 범위

 

덧셈
2 진수의 덧셈은 10진수의 덧셈과 동일합니다. 차이점은 10 진수에서 두 수의 합이 10 이상이 되면 자리올림(Carry)이 발생하지만, 2 진수에서는 두 수의 합이 2가 되면 자리올림이 발생한다는 것입니다. 아래 그림은 자리올림이 발생한 덧셈 과정을 보여줍니다.

자리올림이 발생한 덧셈

 

뺄셈
컴퓨터 내부에서는 덧셈만 가능하므로 뺄셈은 보수를 이용해 덧셈으로 변환한 후 연산합니다. 즉 뺄셈 A - B는 B의 보수를 구한 후 덧셈 A+(-B)로 변환해 연산합니다.

1의 보수 뺄셈
1ㅢ 보수를 이용한 뺄셈은 빼는 수의 1의 보수를 구한 후 더합니다. 만약 최상위 비트에서 자리올림이 발생하면 최하위 비트에 1을 더하고, 자리올림이 발생하지 않으면 연산 결과에 대해 1의 보수를 구한 후 - 부호를 붙입니다. 아래 첫 번째 그림은 자리올림이 발생한 뺄셈을 보여주고, 두 번째 그림은 자리올림이 발생하지 않은 뺄셈을 보여줍니다.

자리올림이 발생한 1의 보수 뺄셈 : 7 - 6
자리올림이 발생하지 않는 1의 보수 뺄셈 : 4 - 6

 

2의 보수 뺄셈
2의 보수를 이용한 뺄셈은 빼는 수의 2의 보수를 구한 후 더합니다. 만약 최상위 비트에서 자리올림이 발생하면 자리올림을 제외한 나머지 부분이 연산 결과이고, 자리올림이 발생하지 않으면 연산 결과에 2의 보수를 구한 후 - 부호를 붙입니다. 아래 그림은 자리올림이 발생한 뺄셈과 발생하지 않은 뺄셈의 이미지입니다.

자리올림이 발생한 2의 보수 뺄셈 : 7 - 6
자리올림이 발생하지 않은 2의 보수 뺄셈 : 4 - 6

 

곱셈
2진수의 곱셈을 하려면 우선 피승수에 승수의 각 수를 곱하여 부분 곱(Partial Product)을 구합니다. 각 부분 곱은 직전 단계의 부분 곱보다 왼쪽으로 한 비트만큼 시프트(Shift) 한 후 더합니다. 예를 들어 110011(2) X 110(2)은 피승수 110011에 승수 110을 곱해 부분 곱을 구한 후 이들을 모두 더하는 것으로, 연산과정은 아래와 같습니다.

 

나눗셈
2진수의 나눗셈은 뺄셈으로 구합니다. 즉 피제수에서 제수를 뺄 수 없을 때까지 뺄셈을 계속해서 횟수는 몫이 되고 남은 것은 나머지가 됩니다.
예를 들자면 100110(2)/110(2)을 구하려면 우선 피제수 100110의 왼쪽 3비트와 제수 110을 비교합니다. 이때 피제수의 3비트가 제수보다 작으므로 피제수의 비교 대상을 늘려 4비트와 제수를 비교합니다.
피제수의 수가 제수보다 크므로 피제수의 4번째 자리 위 몫의 비트는 1이 되고, 제수를 오른쪽으로 한 비트만큼 시프트 한 후 피제수로부터 뺍니다.
뺄셈의 결과는 부분 나머지가 되고, 부분 나머지와 제수를 다시 비교합니다. 부분 나머지가 제수보다 크거나 같다면 몫의 비트는 1이 되고, 제수를 오른쪽으로 한 비트만큼 시프트 한 후 부분 나머지로부터 뺍니다.
부분 나머지가 제수보다 작으면 몫의 비트가 0이되고, 제수를 오른쪽으로 한 비트만큼 시프트 합니다.
이러한 과정이 피제수의 모든 비트에 적용될 때까지 계속합니다.

728x90