본문 바로가기
  • 데이터야 놀자
IT잡학사전

컴퓨터 연산(뺄셈) 과정 에서 필요한 2의 보수 이해하기

by 데이터랑 2024. 4. 8.
728x90

 

 

아들~ 한번 읽어봐 ^^

 

일반적으로 보수의 개념은 컴퓨터 과학과 디지털 회로 설계에서 주로 표현되는 용어로,

부호 있는 정수의 표현과 연산에서 사용된다.

 

주어진 수에 대한 보완적인 수라고 정의하는데 이것만 가지고는 이해가 잘 안된다.

 

예를들어, 

A + B = C 인경우

C값을 위한 A의 보수는 B 로  하면 이해가 좀 쉬울것 도 같다.

(예를들어 10진 연산에서  6에 대한 보수는 4...)

 

그런데 이때 보수를 구하는 방식이 상황에 따라 다른데 

 

보수는 주로 2진수를 사용하기 때문에

컴퓨터 입문하는 학생들은 1의보수와 2의 보수 개념을 이해하면 될것 같다.

 

결론적으로

컴퓨터에서 뺄셈이나 음수처리를 하기 위해서 

" 1의 보수를 만들고 그 결과에 1을 더해 2의 보수를 만들어 활용" 한다 로 이해하면 편하다.

 

보수를 왜 알아야 하는데 ?

 

처음 컴퓨터를 공부하는 학생들이 왜 보수를 배우나 의문점을 가질 텐데

왜냐면 컴퓨터 연산은 덧셈을 기본으로 하기 때문이다. ^^  

 

컴퓨터는 뺄셈 연산할 때도  덧셈하는 방식으로 연산을 하는데

예를 들어 10 - 2 를 계산하기 위해서

컴퓨터는 10 + (-2) 로 인식하고 연산을 처리한다.

 

그러려면  컴퓨터가 음수를 인식할 수 있어야 하기 때문에

이때  2의 보수를 사용해서 표기하게 된다.

 

  • 뺄셈을 덧셈 과정으로 계산하기 위해
  • 음수를 나타내는 방법으로 보수를 이용

 

양수를 음수로 바꾸려면 2의 보수로 변환해야 한다.

 

그럼 양수를 음수로 바꾸는 방법은 2의 보수값으로 바꾸는 것이다  그 방법은 ?

 

1) 먼저 2진수로 표현하고 ( 2진수로 바꾸는 방법은 아래 링크 참조)

2) 이것을 1의 보수로 바꾸고 ( 0은 1로 , 1은 0으로)

3) 위의 결과에 맨 하위비트(LSB) 에 1을 더하면 된다.

 

이때 고려해야 하는 것 중의 하나가 몇 비트로 표현할 것이냐,

그리고 음수표현하려고 하는 것이니 당연히 최상위 비트(MSB) 는 부호를 나타내는 비트로 사용한다는 것을 기억해야 한다.

 

다음표는 10진수 양수를 음수로 바꾼 예제이다.

2의 보수변환 예제

 

 

 

뺄셈 연산을 통한 이해

 

이제 뺄셈을 해볼까~

 

54 -34 를 계산하는 과정을 다음과 같이 풀어보았다. 

 

1) 54를 이진수로 변환
2) 34를 이진수로 변환
3) 뺄셈대상 34를 음수값으로 변환 (이를 위해 2의보수로 변환)

① 먼저 1의보수로 바꾸고
② 2의보수로 변환 (1의보수에 1을 더해서)
4) 54 – 34 를 => 54 + (-34 ) 의 형태로 연산

- 이때 8비트로 처리할경우는 8비트를 벗어나는 캐리는 무시한다는점. 
- 만약 16비트로 처리하면 계속 캐리가 발생해서 올라가겠지
   ^^

 

 

캐리(carry)와 오버플로우(overflow) 차이

연산할 때 캐리가 발생하는데 캐리와 오버플로우 차이를 알아야 한다.

 

1) 캐리 (Carry) 

 

캐리는 연산할때 자리올림이나 자리내림을 의미 ( 위 비트로 자리 올림이 발생했음을 의미하는 것 ) 으로 MSB를 벗어나는 캐리는 무시됨.

 1 + (-1) = 0 이진수로 계산하면 00000001 + 11111111 = 1 00000000

=> 이때 8비트벗어나는 1이 캐리비트로 무시되고 결과값은 0이됨

=> 다시 말하면 MSB 에서 그 위의 비트로 자리 올림, 즉 캐리가 발생하고 이 캐리는 무시된다. 하위 8비트는  0 을 나타냄

 

2) 오버플로우(Overfolw)

오버플로우는 연산 결과 값이 나타낼 수 있는 숫자 범위를 넘어선 것을 의미하고

컴퓨터의 처리방식이나 아키텍처에 따라 처리범위가 달라진다.  

 1 + 127 = 128 이진수로 계산하면 00000001 + 01111111 = 10000000 이 된다. 캐리는 발생하지 않았다. 그러나 결과 값인 이진수 10000000 은 십진수 -128 이며 올바른 답인 +128 이 아니다. +128 은 8비트 이진수로 나타낼 수 없는 값이다. 이 경우는 오버플로우가 발생  (만약 16진수라면 오버플로우가 발생하지 않겠지 !)

 

오버플로우를 이해하면  컴퓨터 언어에서 자료형에 대한 값을 정의하는 이유와 범위를 이해할 것이다!

 

  • 8bit 에서 integer 범위 : -128 ~ 127  (11111111 ~ 01111111 )
  • 16bit에서 integer 범위 : -32768 ~ 32767  (11111111 11111111 ~ 01111111 11111111)
  • 32bit에서 integer 범위 : -2147483648 ~ 2147483647   

 

^^ 사실 처음 이론 배울 때는 필요하지만 그 이후는 컴퓨터가 다 알아서 하니까 신경 쓸 일 없음 ^^

 

 

https://datawith.tistory.com/128

 

소수점을 포함하는 10진수를 2진수로, 2진수를 10진수로 변환

정수를 2진수로 변환하는 것은 쉽게 하다가도 갑자기 소수점을 2진수로 변환하라고 하면 당황하는 경우가 있다. 간단히 정리해 보면 다음과 같다. 소수점을 포함하는 10진수를 2진 수로변경 하려

datawith.tistory.com

 

아들아 ~ 

편식하지 말고 아침 밥 꼭 먹자~

 

728x90
728x90

댓글