C컴파일러가 양수와 음수를 메모리에 저장하는 방식 그 이유
컴퓨터내에서 음수의 표현방식으로는 2의 보수가 쓰입니다.
2의 보수를 사용하는 이유는 덧셈회로를 사용하여 뺄셈을 할수 있다는 점 때문입니다.
옛날에는 덧셈을 위한 회로와 뺄셈을 위한 회로를 따로 가지고 있는 것 보다는
한가지만 가지고 있는 편이 어마어마한 이점이었읍니다.
따라서 역사적으로 CPU에서 사용하는 산술논리연산자에서 2의 보수를 사용하는것이
굳어져온 것입니다.
그러니까 모든 언어에서도 음수를 나타내기 위해서 2의 보수를 사용하는 것입니다.
cpu와 다른 방식으로 음수를 나타내는 것이 매우 불편하기 때문입니다.
그러면 2의 보수는 어떻게 보이는지를 봅니다.
우선 보통의 32비트 cpu에서는 정수를 나타내는데 32비트를 사용합니다.
이 정수의 표현에서 가장높은 비트가 1이면 음수, 0이면 양수로 인식을 합니다.
양수로 음수를 바꿀 때나, 음수를 양수로 바꿀 때 2의 보수를 취해 줍니다.
그런데 처음 배우는 과정에서는 32비트를 모두 다루기가 힘드니까 보통은 비트를
줄여서 8비트나 6비트등으로 줄여서 교실에서 예를 들어 설명하는 것입니다.
여기서도 5비트를 가지고 이야기해 보겠습니다.
5비트로 나타내는 정수의 범위는 2의 보수를 사용할 경우
-16에서 15까지의 32가지 경우를 나타냅니다. (0이 포함되어 있기 때문에 32가지 입니다.)
-16 - 10000
-15 - 10001
-14 - 10010
-13 - 10011
-12 - 10100
-11 - 10101
-10 - 10110
-9 - 10111
-8 - 11000
-7 - 11001
-6 - 11010
-5 - 11011
-4 - 11100
-3 - 11101
-2 - 11110
-1 - 11111
0 - 00000
1 - 00001
2 - 00010
3 - 00011
4 - 00100
5 - 00101
6 - 00110
7 - 00111
8 - 01000
9 - 01001
10 - 01010
11 - 01011
12 - 01100
13 - 01101
14 - 01110
15 - 01111
10의 경우는 5비트일 경우 01010
6비트의 경우는 001010, 16비트의 경우는 0000 0000 0000 1010 과 같이 표현됩니다.
10(십진수)의 경우를 보겠습니다.
먼저 01010 의 1의 보수를 구한다음 1얼 더하면 2의 보수를 구할 수 있습니다.
01010 의 1의 보수를 구하면 10101 이 됩니다.
1의 보수에 1을 더하면 10110 이 됩니다. 이 10110 이 -10이 되는 것입니다.
위의 표에서 같다는 것을 확인 할수 있습니다.
2의 보수의 성질의 한가지는 원래의 수와 그수의 2의 보수를 더하면 1 00000 과 같은 수가 나온다는
것입니다. 한번 더해 보겠습니다.
01010
10110
---------
1 00000 가 나옵니다. 위에서 모든 수들의 쌍에 대해서 검토를 해보면 이와 같이 나옵니다.
2의 보수의 덧셈에서는 자리수를 넘는 비트는 버립니다. 따라서 0이 나온 것입니다.
지금까지 설명한 것으로 어느정도 이해가 되셨을 것으로 봅니다.