반응형
2의 보수에 대하여 알아보기 전에 1의 보수에 대하여 먼저 알아보도록 하겠습니다. 1의 보수는 0은 1로 1은 0으로 바꾸는 방식입니다.
1의 보수
0000 0100 -> 1111 1011
이렇게 바꾸는 것이 1의 보수입니다.
2의 보수는 1의 보수에 1을 더하는 것입니다.
0000 0100 -> 1111 1011 +1 -> 1111 1100
위에 예제에서 2의 보수는 음수값을 가지고 있습니다.
그럼 이렇게 사용하는 이유에 대하여 알아보도록 하겠습니다. 컴퓨터에서 음수를 표현하기 위해 처음 생각한 것은 1의 보수에 의한 표현입니다.
예를 들어
4: 0000 0100
-4: 1111 1011
이런식으로 표현을 하였습니다. 여기에서 참고로 이때 실제로 사용하는 것은 7비트만을 사용합니다. 그 이유는 전부인 8비트를 사용하면 음수값과 구별이 안 되기 때문입니다. 이때 숫자 값으로 사용되지 않는 맨 앞비트를 부호로 표현하였습니다. 이를 사인비트라고 합니다.
그런데 1의 보수를 사용하다 보면 문제가 있습니다. 그 문제는 0이 2개가 생긴다는 것입니다.
+0 : 0000 0000
-0 : 1111 1111
0은 매우 중요한 숫자이므로 이러한 문제가 발생이 되면 안됩니다. 그래서 2의 보수를 만들게 되었습니다.
2의 보수는 1의 보수의 +1 입니다.
그래서 1111 1111은 0이 아니고 -1 입니다.
0000 0001 -> 1111 1110 -> 1111 1111
그러므로 한 바이트의 범위는 -128 ~ 127 이 됩니다.
물론 2의 보수를 사용한다면 연산이 쉽게 됩니다.
우리가 보통 사용하는 컴퓨터들은 뺄셈 로직이 없습니다. 뺄셈 로직이 있다면 보수를 사용할 이유가 없어집니다. 4-4를 그냥 연산하면 된다는 의미이겠지요. 하지만 뺄셈 로직이 없기 때문에 4-4를4 + (-4)로 계산하게 됩니다. 4를 빼는 것이 아니라 -4로 바꿔서 더하는 것입니다.
그럼 컴퓨터가 왜 2진수로 변환된 데이터만을 취급하는 이유에 대해 알아보겠습니다. 하드웨어적인 이유에서도 2의 보수를 사용하는 이유가 있습니다. 컴퓨터의 내부는 전자부품인 IC(Integrated Circuit = 직접회로)로 구성되어져 있습니다. 간단히 말하자면 컴퓨터 내부를 뜯어 보았을때, cpu의 양쪽에 여러개에서 수백개까지의 다리처럼 붙어있는 지네같은 모양을 IC라고 부릅니다. 이 IC에 달려있는 지네의 다리모양의 핀들은 보통 직류전압 0V 나 5V중 하나의 전압을 갖게 됩니다. 따라서 IC의 핀 1개로는 두 가지 상태밖에 나타낼 수 없습니다.
이러한 하드웨어의 여건상 컴퓨터는 부득이하게 2진수를 사용하게 되었습니다. 물론, 더 좋은 IC를 개발할 수 있지만, 평이하고 대중화 시키기에는 2개의 전압을 갖는 IC를 제작하는 것이 컴퓨터 가격면이나 성능면에서 결코 떨어지지 않기 때문에 사용하는 것입니다.
그럼 2의 보수가 컴퓨터 시스템 상에서 얼마나 중요한 것인지 알아보았습니다. 그럼 5 개의 숫자에 대한 2의 보수를 예제로 들어보도록 하겠습니다.
EX1)
‘1’ 의 2의 보수
0000 0001 → 1111 1110 → 1111 1111
< 1 > <1의 보수> <2의 보수>
EX2)
‘3’ 의 2의 보수
0000 0011 → 1111 1100 → 1111 1101
< 3 > <1의 보수> <2의 보수>
EX3)
‘6’의 2의 보수
0000 0110 → 1111 1001 → 1111 1010
< 6 > <1의 보수> <2의 보수>
EX4)
‘9’의 2의 보수
0000 1001 → 1111 0110 → 1111 0111
< 9 > <1의 보수> <2의 보수>
EX5)
‘10’ 의 2의 보수
0000 1010 → 1111 0101 → 1111 0110
< 10 > <1의 보수> <2의 보수>
그럼 뺄셈의 예제를 들어보도록 하겠습니다.
EX1)
“9 - 9”
9 - 9 → 9 + (-9)
9: 0000 1001
-9: 1111 0111
결과: 0000 0000 결과값은 ‘0’ 나오게 됩니다.
EX2)
“7 - 4”
7 - 4 → 7 + (-4)
7: 0000 0111
-4: 0000 0100(4) → 1111 1011 (4의 1의보수) → 1111 1100(4의 2의보수)
결과 : 0000 0011 결과값은 ‘3’ 나오게 됩니다.
EX3)
“19 -10”
19 - 10 → 19 + (-10)
19: 0001 0011
-10: 0000 1010(10) → 1111 0101(10의 1의보수) → 1111 0110(10의 2의보수)
결과 : 0000 1001 결과값은 ‘9’ 나오게 됩니다.
EX4)
“3 - 5”
3 - 5 → 3 + (-5)
3: 0000 0011
-5: 0000 0101(5) → 1111 1010(5의 1의보수) → 1111 1011(5의 2의보수)
결과: 1111 1110 결과값은 ‘-2’ 나오게 됩니다.
EX5)
“1 - 7”
1 - 7 → 1 + (-7)
1: 0000 0001
-7: 0000 0111(7) → 1111 1000(7의 1의보수) → 1111 1001(7의 2의보수)
결과: 1111 1010 결과값은 ‘-6’ 나오게 됩니다.
1의 보수
0000 0100 -> 1111 1011
이렇게 바꾸는 것이 1의 보수입니다.
2의 보수는 1의 보수에 1을 더하는 것입니다.
0000 0100 -> 1111 1011 +1 -> 1111 1100
위에 예제에서 2의 보수는 음수값을 가지고 있습니다.
그럼 이렇게 사용하는 이유에 대하여 알아보도록 하겠습니다. 컴퓨터에서 음수를 표현하기 위해 처음 생각한 것은 1의 보수에 의한 표현입니다.
예를 들어
4: 0000 0100
-4: 1111 1011
이런식으로 표현을 하였습니다. 여기에서 참고로 이때 실제로 사용하는 것은 7비트만을 사용합니다. 그 이유는 전부인 8비트를 사용하면 음수값과 구별이 안 되기 때문입니다. 이때 숫자 값으로 사용되지 않는 맨 앞비트를 부호로 표현하였습니다. 이를 사인비트라고 합니다.
그런데 1의 보수를 사용하다 보면 문제가 있습니다. 그 문제는 0이 2개가 생긴다는 것입니다.
+0 : 0000 0000
-0 : 1111 1111
0은 매우 중요한 숫자이므로 이러한 문제가 발생이 되면 안됩니다. 그래서 2의 보수를 만들게 되었습니다.
2의 보수는 1의 보수의 +1 입니다.
그래서 1111 1111은 0이 아니고 -1 입니다.
0000 0001 -> 1111 1110 -> 1111 1111
그러므로 한 바이트의 범위는 -128 ~ 127 이 됩니다.
물론 2의 보수를 사용한다면 연산이 쉽게 됩니다.
우리가 보통 사용하는 컴퓨터들은 뺄셈 로직이 없습니다. 뺄셈 로직이 있다면 보수를 사용할 이유가 없어집니다. 4-4를 그냥 연산하면 된다는 의미이겠지요. 하지만 뺄셈 로직이 없기 때문에 4-4를4 + (-4)로 계산하게 됩니다. 4를 빼는 것이 아니라 -4로 바꿔서 더하는 것입니다.
그럼 컴퓨터가 왜 2진수로 변환된 데이터만을 취급하는 이유에 대해 알아보겠습니다. 하드웨어적인 이유에서도 2의 보수를 사용하는 이유가 있습니다. 컴퓨터의 내부는 전자부품인 IC(Integrated Circuit = 직접회로)로 구성되어져 있습니다. 간단히 말하자면 컴퓨터 내부를 뜯어 보았을때, cpu의 양쪽에 여러개에서 수백개까지의 다리처럼 붙어있는 지네같은 모양을 IC라고 부릅니다. 이 IC에 달려있는 지네의 다리모양의 핀들은 보통 직류전압 0V 나 5V중 하나의 전압을 갖게 됩니다. 따라서 IC의 핀 1개로는 두 가지 상태밖에 나타낼 수 없습니다.
이러한 하드웨어의 여건상 컴퓨터는 부득이하게 2진수를 사용하게 되었습니다. 물론, 더 좋은 IC를 개발할 수 있지만, 평이하고 대중화 시키기에는 2개의 전압을 갖는 IC를 제작하는 것이 컴퓨터 가격면이나 성능면에서 결코 떨어지지 않기 때문에 사용하는 것입니다.
그럼 2의 보수가 컴퓨터 시스템 상에서 얼마나 중요한 것인지 알아보았습니다. 그럼 5 개의 숫자에 대한 2의 보수를 예제로 들어보도록 하겠습니다.
EX1)
‘1’ 의 2의 보수
0000 0001 → 1111 1110 → 1111 1111
< 1 > <1의 보수> <2의 보수>
EX2)
‘3’ 의 2의 보수
0000 0011 → 1111 1100 → 1111 1101
< 3 > <1의 보수> <2의 보수>
EX3)
‘6’의 2의 보수
0000 0110 → 1111 1001 → 1111 1010
< 6 > <1의 보수> <2의 보수>
EX4)
‘9’의 2의 보수
0000 1001 → 1111 0110 → 1111 0111
< 9 > <1의 보수> <2의 보수>
EX5)
‘10’ 의 2의 보수
0000 1010 → 1111 0101 → 1111 0110
< 10 > <1의 보수> <2의 보수>
그럼 뺄셈의 예제를 들어보도록 하겠습니다.
EX1)
“9 - 9”
9 - 9 → 9 + (-9)
9: 0000 1001
-9: 1111 0111
결과: 0000 0000 결과값은 ‘0’ 나오게 됩니다.
EX2)
“7 - 4”
7 - 4 → 7 + (-4)
7: 0000 0111
-4: 0000 0100(4) → 1111 1011 (4의 1의보수) → 1111 1100(4의 2의보수)
결과 : 0000 0011 결과값은 ‘3’ 나오게 됩니다.
EX3)
“19 -10”
19 - 10 → 19 + (-10)
19: 0001 0011
-10: 0000 1010(10) → 1111 0101(10의 1의보수) → 1111 0110(10의 2의보수)
결과 : 0000 1001 결과값은 ‘9’ 나오게 됩니다.
EX4)
“3 - 5”
3 - 5 → 3 + (-5)
3: 0000 0011
-5: 0000 0101(5) → 1111 1010(5의 1의보수) → 1111 1011(5의 2의보수)
결과: 1111 1110 결과값은 ‘-2’ 나오게 됩니다.
EX5)
“1 - 7”
1 - 7 → 1 + (-7)
1: 0000 0001
-7: 0000 0111(7) → 1111 1000(7의 1의보수) → 1111 1001(7의 2의보수)
결과: 1111 1010 결과값은 ‘-6’ 나오게 됩니다.
반응형
'프로그래밍' 카테고리의 다른 글
vc++ 6.0 에서 gotoxy(), clrscr() 사용하는방법 (0) | 2008.04.25 |
---|---|
이중 포인터형의 동적메모리 할당 해제 (0) | 2008.04.25 |
2차 배열 초기화 (0) | 2008.04.25 |
링크드리스트 모든 동적할당 메모리 해제 함수 (0) | 2008.04.25 |
fwrite(),fread() (0) | 2008.04.25 |