본문 바로가기
CS/컴퓨터구조

음수의 표현

by chogigang 2023. 10. 28.

우리는 일상적으로 음수를 표현할때는 10진수를 주로 쓰며 앞에     - <= 가있으면 일반적으로 음수라고 알아차립니다

하지만 컴퓨터가 음수를 인식할때는 다르게 인식을 합니다 컴퓨터는 2진수의  0 ,1 만 인식을 하기때문에 메모리에 

어떻게 저장을 하는지 오늘 작성을 할겁니다

 

 

 

음수의 표현 방법들

  1. 절대값 앞에 부호비트만 넣는다
  2. 절대값에서 1의보수
  3. 절대값에서 2의 보수 

 

 

절대값 앞에 부호비트 만 넣기

앞서 부동 소수점 2진수 표현을 할때 맨 앞 비트는 부호 비트라고 했던것을 기억을 할것입니다.

 

8bit 로 숫자를 표현할때   메모리상으로 어떻게 표현이 될까요?

 

 

 

이렇게  표현 비트중 맨앞 비트는 부호비트 0이면 양수 1이면 음수로 표현이되고 나머지 7bit는 절대값을 표현하는 비트로 활용이 됩니다.   이렇게 간단하게 음수를 표현할수있지만 이 표현법에서는 문제점이 발생합니다.

(음수)+(양수)    ,  (양수)+(음수) 일때는 절대값은 감소 하기 때문에 문제가 없습니다 하지만 

 (음수) +(음수)    이거나   (양수)+(양수) 일때는   절대값이 증가한다 즉 비트에서 표현할수 있는 값을 초월 해버려 자리값 증가 캐리(carry) 가 발생할수도 있습니다 이것을 다른말로 오버플로(overflow) 라고 합니다. 

8비트로 예를들어 첫번째 비트는 부호비트 로 사용을 하니 빼고 나머지 비트로 표현하면 0~255 입니다

만약   -254 -2 =       를 하거나      255+3 =   같은걸 하면 비트에서 표현할수 있는 범위를 초과해 자릿수가 넘어간 비트는

 아래 그림 과 같이 진행이 됩니다.

 

 

마치 카운터 기계랑 똑같은 원리입니다

 

 

그리고 

2(10) + 3(10) = 0 010 + 0 011 = 0 101 = 5(10)

(양수끼리 더했으므로 양수) <덧셈기 사용>

 

-2(10) + -3(10) = 1 010 + 1 011 = 1 101 = -5(10)

(음수끼리 더했으므로 음수) <덧셈기 사용>

 

3(10) - 2(10) = 0 011 - 1 010 = 0 001 = 1(10)

(절대 값이 큰 수에서 작은 수를 뺐으므로 양수) <뺄셈기 사용>

 

2(10) - 3(10) = 0 010 - 1 011 = -(011 - 010) = 1 001 = -1(10)

(절대 값이 작은 수에서 큰 수를 뺄 경우에는 순서를 바꿔서 빼고 결과는 음수) <뺄셈기 사용>

 

인간에게는 매우 쉬운 일이지만, 위의 모든 사항을 고려하여 계산을 수행하는 회로를 만드는 것은 쉬운 일이 아닙니다 그리고 <, >, <=, >= 등의 비교연산을 수행할 때 다음과 같은 모순이 생깁니다.

 

3(10) > 2(10) = 0011 > 0010 = TRUE

-2(10) > -3(10) = 1010 > 1011 = FALSE (???)

 

위와 같이 음수의 경우는 반대가 되므로 이를 구분해야 합니다. 사실 비교연산은 뺄셈을 한 후 결과의 부호를 가지고 판단하기 때문에 이는 덧셈과 뺄셈 문제와 동일합니다.

 

이를 방지하기 위해서 다른 방법을 사용 합니다

 

절대값의 1의 보수

1의 보수는 간단하게 기존 절대값 비트의 반대되는 비트입니다 예를들어 보겠습니다

25   => 00011001   

-25  => 11100110       0이면 1로   1이면 0으로 뒤집어서 표현합니다. 

25의 완전한 반대가 -25 이기때문에   not 게이트 는 반대로 표현이 되기때문에  not 게이트 로도 표현이 됩니다 예를들어서

b=25   , b`==-25 비트를 반대로 뒤집어서 표현하기때문에 저렇게 표현 할수 있습니다.

 

부호와 1의 보수에 의한 표현에서의 가산은 부호와 절대치에 의한 표현과 부호와 2의 보수에 의한 표현에서의 가산( + )과 같이 오버플로에 유의해야 합니다 그리고 1의 보수에 의한 표현에서의 가산에서는 추가적으로 부호 비트에서 자리올림수가 발생하면 반드시 연산 결과에 추가해야 합니다  

 

 

 

 

사진과 같이 연산 도중 자리올림으로 왼쪽 비트가 1이 추가가 되면 밑으로 내려서 +1을 해줘야 합니다. 

주의 해야할 점은 저렇게 연산할때는 양수는 그냥 절대값 2진수 비트를 적고 음수일때만 보수로 변환한

비트를 적어야 합니다    똑같이 보수표현으로 통일시켜서 연산할 필요가 없습니다.

 

 

 

 

절대값 의 2의 보수

1의 보수 비트에서 +1 을 더해줍니다. 예를들어 00011001   =25

                                                                           11100110  <= 1의 보수

                                                                         +             1

                                                                         ------------------

                                                                           11100111    <= 2의 보수 

 

이렇게 진행이 됩니다.  오버플로우가 발생했을시에도  1의 보수와 똑같습니다.

 

   -25   2의 보수  =>      11100111

   -12의 2의 보수 =>  +  11110100

                                   ----------------

           올림발생 => (1)   11011011

                                 +                1

                            --------------------------

                                    11011100    => 이걸 다시 1의 보수처럼 뒤집으면 절대값이 나옵니다 이걸 안뒤집고 

                                                              그냥 비트 계산 해버리면 -44가 나올겁니다 

                                  00100011   =>  37       (-25-12   의 절대값인 37이 나옵니다)

 

            다시 한번 강조 하지만  음수 표현일때만 보수를 이용해서 비트를 적고 양수는 그냥 적어서 그자체로 연산합니다.

 

 

 

 

 

            다음 시간에 더 자세한 비트 연산을 작성해봅시다.

 

        

                                    

 

 

 

 

 

'CS > 컴퓨터구조' 카테고리의 다른 글

중앙 처리장치(CPU)  (0) 2023.11.10
정수의 산술 연산  (1) 2023.11.03
부동 소수점 2진수 표현  (0) 2023.10.19
진법 변환  (0) 2023.10.19
컴퓨터 시스템의 개요(컴퓨터 5대 장치포함.)  (1) 2023.10.19