한 비트를 음수/양수를 나타내는 비트로 만들어 숫자가 음수인지 양수인지 파악하게 할 수 있다. 하지만 이 문제는 몇가지 문제가 존재함
4비트 시스템을 예로 들어보자. 이때 0을 표현하는 방식은 -0과 +0이 가능하므로 0000과 1000 두개이다. 즉 어떤 데이터가 0인지를 파악하기 위해 두번의 연산을 진행해야 한다. 이는 0과의 비교연산을 수행한다던가 할때 컴퓨터자원을 낭비하게 되므로 문제가 된다.
덧셈알고리즘이 복잡해진다.
7에 어떤 수를 더해야 0이 될까?? 답은 -7이다. 이 방법에서 착안해 어떤 수의 음수는 해당 수와 더했을 때 0이 된다는 점에서 양수 음수를 만드는 방법을 2의 보수법이라고 한다. 4비트 시스템에서 7은 0111이다. 이때 아래 식이 성립하므로
-7의 2의 보수법 표현은 1001이 된다. 여기서 두 연산의 값이 0000이 되는 이유는 CPU가 처리하는 데이터의 길이는 정해져 있기 때문이다. 즉 4비트를 넘어서는 비트는 버려진다. 따라서 2의 보수법은 한 숫자를 이용해 해당 비트를 1로 꽉 채울 수 있는 비트열에 1을 더함으로서(overflow 발생) 이루어진다.
따라서 2의 보수법을 이용해 음수를 만들기 위해서는 한 양수를 반전시키고 1을 더해서 만들면 된다
해당 보수법을 이용해 만든 수에는 장점이 더 있다.
1. 음수의 원래 값을 알기 쉽다.
- 음수의 값을 알기 위해서는 해당 표현에 1을 빼고 다시 반전시킨 수에 -를 붙이면 된다.
2. 수가 음수인지 양수인지 알기 쉽다.
- 음수 양수를 둘다 표현하기 때문에 숫자의 표현범위는 양수 반 음수 반이렇게 나누어가지게 된다.
- 따라서 양수 표현으로 표현가능한 수에는 맨 앞자리가 1인 숫자가 없다.
- 따라서 그를 반전시켰을 때 모든 음수는 앞자리가 1이 된다.
- 즉 맨 앞비트가 1인지 0인지를 확인해 음수 양수를 판별할 수 있다.
위 방법을 통한다면 왜 정수의 양수표현범위가 음수보다 하나 적은지를 알 수 있다. 한 비트를 이용해 음수 양수를 판별하기 위해서는 맨 앞비트를 음수에게 할당해야한다. 따라서 양수가 가질수 있는 최대값은 앞에 1비트를 제외한 나머지 비트로 만들어진 수이므로 한 자리가 더 적게된다.
unsigned 키워드가 붙었다면 그저 음수로 생각하고 해석할 비트열을 양수라고 생각할 뿐이다. 즉 모든 비트열을 양수처럼 파악할 수 있다.