본문 바로가기

CS

이진법과 2의 보수

이진법

 

 

 

사람은 실생활에서 0~9 사이의 숫자를 기록하고 사용하는 10진법에 익숙하지만 컴퓨터는 전류가 흐르는지 아닌지에 기반한 0과 1만을 이용하는 이진법으로 수를 표현한다. 이 때  표현된 수는 이진수라고 부른다.

그런데 수를 표현하는 데에 있어서 자연수만 존재하는 것이 아니라 음수 또한 존재하게 되는데 문제는 이진법으로 음수를 직접적으로 나타낼 방법이 없다는 것이다. 즉 이진수로 음수를 나타내기 위해선 보조적인 방법이 필요하다.

 

 

 

 

 

음수의 표현

 

 

 

1) 부호 절댓값 표현법

 

 

 

컴퓨터에서는 0 혹은 1의 값을 가질 수 있는 하나의 칸을 '비트(bit)' 라고 한다. 또한 1bit는 자료를 저장하는 가장 작은 단위이다.

부호 절댓값 표현법은 최상위 비트인 가장 왼쪽 비트를 부호 비트로 사용하여 0은 양수로, 1은 음수로 표현하는 방법이다.

이 최상위 비트를 제외한 나머지 비트들은 해당 숫자의 절댓값을 나타낸다.

 

예시) 4비트로 -3을 표현할 경우 -3은 4자리의 비트 중 첫번째 자리는 - 부호에 해당하는 값인 1이 들어가고 나머지는 2진수로 변환한 값인 1011이 들어가게 된다.

 

이러한 최상위 비트 값을 부호로 표현하는 방법은 사람 입장에서 직관적이지만 컴퓨터 입장에서는 불편한 점들이 있는데 그 이유는

 

     (1) 0이 양수와 음수, 두 가지로 나뉘어 표현되기 때문에 둘 모두를 하나의 0으로 인식시켜야 한다는 점

 

최상위 비트인 부호값이 양수 아니면 음수로 항상 존재하기 때문에 2진수로 나타내진 0000의 값은 10진수인 +0이나 -0으로 표현된다. 

 

     (2) 양수와 음수의 연산에 있어서 교환법칙이 발생하지 않기 때문에, 연산에 있어서 복잡해지고 예외사항이 생기는 점

 

이 존재한다.

 

 

 

 

 

2) 보수

 

부호 절댓값 표현법의 문제점중 하나는 덧셈과 뺄셈을 다르게 처리해야 한다는 점에 있다. 부호 절댓값 표현법은 부호와 절댓값을 따로 계산해야 하므로 덧셈과 뺄셈을 각각 다른 방식으로 처리해야 한다.

 

이러한 문제는 컴퓨터가 덧셈을 수행하는 데에 있어서 최적화 되어 있어 덧셈 회로가 보다 간단하게 구현될 수 있도록 설계되어 있기에 2의 보수를 사용하여 덧셈과 뺄셈을 동일한 방식으로 처리할 수 있게 된다.

 

 

여기서 보수두 수의 합이 진법의 밑 수가 되게 하는 것이다.

예를 들어 10진수에서 4의 보수는 합이 10이 될 수 있는 6을 뜻한다.

 

각 보수는 n진법마다 존재하는데 n진법에서는 n의 보수와 (n-1)의 보수가 둘 다 쓰이게 된다. n의 보수는 (n-1)의 보수에 +1을 해준 것과 같다. 이러한 보수는 부호 절댓값 표현법의 문제점인 음수의 연산이 복잡해지는 점을 해결하기 위해, 즉 음수 양수 상관없이 덧셈만으로도 일관되게 결과값을 얻기 위해 사용한다.

 

-40 + 58의 연산을 예시로 들어보면 
{ (100 - 40 ) + 58 }  - 100
{ 60 + 58 } - 100

118 - 100

= 18 

로 답을 구할 수 있다.

 

다만 보수만 구하는 식으로 변형해서 사용하게 되는데 마지막에 100을 빼지 않고 108의 값을 그대로 비트 값에 대입하여 봤을 때 앞의 1은 올림으로 발생한 수라 자리 올림되었다는 의미에서 캐리 발생이라고 한다. 이러한 캐리가 발생할 경우 '양수', 발생하지 않으면 '음수'라는 것을 알 수 있다.

 

이렇게 보수는 컴퓨터 연산에 있어서 중요한 의미를 갖는데 이진수에서 계산을 할 때 제일 간단한 1의 보수에 +1을 해주면 필요한 2의 보수도 얻을 수 있다.

1의 보수는 이진수에서 모든 비트 값을 1로 채운 상태에서 주어진 수를 뺀 값을 뜻하는데 이러한 1의 보수 또한 +0과 -0이 존재한다는 단점이 그대로 존재하여 이를 해결하기 위해 2의 보수를 사용한다.

 

+0과 -0이 모두 존재한다는 문제점은 -0을 없앤다는 해결책으로 해결할 수 있는데 이는 음수 영역에서 양수 영역에 대응되는 수들은 -1씩 하여 대응시키는 것이다.

가령 10진수 +0 (2진수 표현 0000 0000) 에 대응하는 숫자를 10진수 숫자 -0 (2진수 표현 1111 1111)이 아닌 10진수 숫자 -1 (2진수 표현 1111 1111)에 대응시키는 것이다

 

이렇게 -1씩 대응시키게 되면 비트를 그대로 반전시킨 1의 보수와 달리 양의 0, 음의 0의 존재 문제를 해결하기 위해 숫자들이 -1씩 밀려져 대응되었으므로 a에서 b를 뺄 때 b에 대한 2의 보수는 1의 보수 +1이 된다.

 

즉 부호를 바꾸기 위해 2의 보수를 사용하게 되었는데 이는 비트를 모두 반전시킨 후 +1의 값을 더하면 된다는 것이다.

 

이러한 2의 보수를 사용하게 되면 덧셈 만으로 연산을 할 수 있기 때문에 회로가 단순해지며 1의 보수의 단점이었던 캐리 발생 문제와 0이 두 개가 존재한다는 점을 해결할 수 있다.

'CS' 카테고리의 다른 글

값에 의한 호출 & 주소에 의한 호출 & 참조에 의한 호출  (0) 2023.10.30
비트연산자  (0) 2023.10.27
오버플로우와 언더플로우  (0) 2023.10.26
부동소수점의 의미와 표현  (0) 2023.10.25