양수는 +가 생략된 정수이고,
일반적으로 2진법의 정수는 [1][1][1][1][1][1][1][1] =256 가지의 수가 나오고, 실제로 사용 가능한 수는 0~255 이다.
(가짓수에 0이 포함되기 때문에 256 이되는 것)
하지만 음수를 표현 하기 위해 위 8비트중 반으로 나눠 ([1][1][1][1]/[1][1][1][1]) 절반을 음수의 영역으로 지정한다.
그래서 정수의 표현은 [00001111](편의를 위해 바꿈) 0~127까지로 표현되고
음수의 표현은 [11110000] 128~255이면서, 255=-1 254=-2 와 같은 음수로도 표기가 된다.
실제 연산으로 예를 들어보는게 이해가 잘 되겠다.
EX) [00000011] = 정수 3
[11111101] = 음수-3(정수 253)
[00000000] = 1과1이 더해지면 2가 되어 올림이 되기 때문에 모든 수가 0이 된다.
사실상 음수의 표현은 [1000000]인 128 부터 가상적으로 음수로 표현된다고 보면 된다. 그게 이해하기 편할 듯
컴퓨터의 연산에는 빼기가 없기 때문에 모두 더하는것으로 한다.
양수간의 빼기는 양수를 음수로 변환하는 것으로 더해버린다.
(+1) - (+1) 을 (+1) + (-1)로 표현 하는것과 같다.
양수를 음수로 변환하는데는 보수라는 것을 사용하는데,
보수는 해당 수가 되기 위해 필요한 수.. 라고 생각하면 될 듯 하다.
음수를 나타내기위한 보수 표현법
EX) 7에 대한 9의 보수는? = 7이 9가 되기위해 필요한 수를 뜻하기 때문에 7+?=9 와 같은 수식이 나온다.
그러면 정답은 2가 되겠지.
이걸 활용하여 조금 큰수로 추가로 예를 들어보면
12,345,678 에 대한 9의 보수를 표현하면
87,654,321 과 같이 9가 될 수 있는 반댓수를 사용하게 된다.
결과 값은 99,999,999 가 될 것이다.
그렇다면 10의 보수 같은경우는 어떻게 될까?
만약 12,345,678의 수의 10의 보수는 몇인가?
최종적으로 100,000,000의 결과 값이 나와야 한다. (올림값이 존재하기 때문이라고 봄)
그래서 위의 9의 보수 방식과 동일하지만 보수의 마지막 자리에 1을 더해주어서 위의 결과 값이 나올수 있을 것이다.
이런 방식으로 2진법에서 2의 보수를 활용하여 컴퓨터에서는 양수를 음수로 만들어낸다.
2진법에서의 보수는 해당하는 정수의 비트를 모두 반대로 바꾼후 1을 더하는것으로 보수가 만들어진다. (10의보수 처럼)
EX2) [00000001] 의 2의 보수는? (2진법이기 때문에 2의 보수다 올림값 존재)
[00000001] = 정수 1
[11111110] = 모든수를 반대로 바꿈
[11111111] = 그 다음 1을 더 해주었다 정수255 = -1과 같기 때문이다.
결론적으로 덧셈만 할 수 있는 컴퓨터가 보수 표현법을 통해 양수를 음수로 변환 함으로써 빼기연산이 가능하게 된다는 것을 알게 되었다.
추가로...
음수의 표현을 위해 8비트의 중간을 나눠 0~127과 128~255(-127~-1)의 수
255에서 +1이 되면 -1이 되고
-127에서 -1이 되면 128이 되는.. 끝과 끝이 맞물려 띠처럼 돌아가는걸 잘 생각 해야 된다.
0~127/128~255/-1~-127/128
-127(정수128) = [10000000] 여기서 -1 이 되면 127 되는게 아니라. 정수영역인 128이 된다?
255(음수-1) = [11111111] 여기서 +1 이 되면 0이 되는데 아니라. 음수인 -1이 된다고?
이해가 안됨
'이해를 위한 메모 공간' 카테고리의 다른 글
6.객체지향프로그래밍 (0) | 2020.03.25 |
---|---|
4. 기본 연산자 (0) | 2020.03.23 |
3-4. 명시적 형변환과 묵시적 형변환 (0) | 2020.03.20 |
3-2.상수와 리터럴상수 (0) | 2020.03.20 |
2-1. bit, byte 개념 및 2, 8, 10, 16진법에 대한 이해 (0) | 2020.03.19 |