[기본원리] 2진수의 음수표현법!

반응형




2진수 관련 음수표현법입니다.

2진수에서 음수를 나타내는 방법은 부호를 나타내는
최상위비트(MSB : Most Significant Bit) 를 사용하는 것인데요,
이 최상위비트를 부호비트라고 합니다.

부호비트가 0이면 양수, 1이면 음수를 나타내는 방식이죠.

예를들어 10진수 1은 2진수로  00000001  이 됩니다.
그럼 10진수 -1 은 얼마일까요?
흔히  10000001  이라고 생각하기 쉽지만 ,
실제로 10진수 -1 의 2진수는  11111111  이 됩니다.

왜냐구요?
아래 글을 잘 읽어 보시면 아하! 라고 하실껍니다 ^^;

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥



2진수 음수계산

우선 이렇게 생각해 보죠.
1-1 = 0 입니다.
이것은 바꿔 말하면  1 + (-1)  과 똑같지요.

그렇다면 이것을 암산이 아닌,
2진수로 계산해 볼까요?


범위를 넘어서는 자리는 버려버리므로 값에 포함되지 않습니다.
이 결과식에서와 같이 -1 은  10000001 이 아니라 
11111111  이라는것을 아시겠지요??ㅎ




실제 빼기 연산은 덧셈으로 ..

실제로 컴퓨터는 빼기 연산을 모릅니다.
단, 빼기 연산을 덧셈처럼 수행하지요 !  [  1 + (-1) 처럼 ]

2진수 1은  ' 00000001 '   이고  2진수 -1 은  ' 11111111 ' 이 됩니다.
즉, 1을 -1로 바꾸려면 
0은 1로, 1은 0으로 바꾼 다음     [ 00000001  ->  11111110 ]
그런 다음 +1 을 하면 됩니다.     [ 11111110  ->  11111111 ]


앞의 계산식에서 보면 1 - 1 = 0 은 
2진수로  [ 00000001 + 11111111  =  100000000  ] 이 되어 버렸습니다.
9번째 자리가 넘쳐 1이 되었지만 초과한 자리는 무시하도록 되어있기 때문에 0으로 처리되지요.

어찌 되었든  1을 -1 로 바꾸는 것처럼 음수로 바꾸는 것을 보수 라고 합니다.
보수를 구하는 방법은 결국,  1은 0으로.. 0은 1로 바꾼 후 + 1 을 한다는 것입니다.

또한 구해진 음수의 검사법은 ' 어떤 2진수의 보수에 원래의 값을 더하면 0이 된다 ' 입니다.

 

그럼 여기서 또 하나의 문제.
연산 결과가 음수인 경우에는 어떻게 될까요?

연산 결과가 음수인 계산

이렇게 생각해 봅시다.
10진수의  2-4  는 결과가 -2 가 되지요?

그럼 2는 2진수로  ' 00000010 '  이 되겠고,  4는  ' 00000100 ' 이 됩니다.
4는 -4 이므로 보수를 취하게 되면  -4는  ' 11111100 ' 이 되지요.
결국 2-4는 2진수 연산에선  [  00000010  +  11111100  ] 이 됩니다.

위와같은 연산이 이루어 지는 것이지요 ~

결과값의 최상위 자리가 1이므로 음수가 됩니다.
즉, 결과값이 음수인 경우가 됩니다.

그렇다면 결과로 나온  ' 11111110 ' 은 얼마일가요?
위에선 이미 -2 라고 공표해 버렸지만요 ^^;

음수 결과값을 알아내기 위한 방법 중 재미있는 것은
보수의 보수를 취하면 된다는 것입니다.

자, 1의 보수는 -1 이라고 했습니다.
그렇다면 -1의 보수는 ?  1이 되겠죠 .

이것을 결과로 나온  ' 11111110 ' 에 대입하여 보수로 표현해 보면  ' 00000010 ' 이 됩니다.
이것을 10진수로 나타내면  2 가 되므로,  ' 11111110 ' 은  -2 라는 사실을 알수가 있지요 .


음수를 취급하는 자료형

프로그래밍 언어에서의 자료형은 음수를 취급할 수 있는 것과 취급하지 않는것이 있습니다.
예를들면 short 형은 음수를 취급할 수 있고 unsigned short 형은 음수를 취급하지 않지요.

short 자료형은 2Byte 크기를 사용하므로 2의 16제곱, 즉 65,536 개의 값을 표현할 수 잇는데요,
값의 범위가 각각 다릅니다.


  • short 형은  -32,768  ~  32,767 까지,
  • unsigned short 형은  0  ~  65,535 까지.

이것의 차이는 최상위비트를 부호비트로 볼 것인지, 값으로 볼 것인지에 대한 차이입니다.

음수 사용이 가능한 자료형에서
양수의 범위는  0  ~ 32,767 이고,
음수의 범위는  -1 ~ -32,768  까지 입니다.

즉, 0이 양수의 범위에 포함되기 때문에 음수가 하나 더 많아지는 것이지요.
실제 0은 양수도 음수도 아닙니다.
하지만 부호비트 라는 녀석 덕분에 0은 양수에 포함되게 되었습니다 ^^




반응형

댓글

Designed by JB FACTORY