일단 시작하는 IT개발 블로그
  • 2의 보수 정리.(컴퓨터의 음수표현)
    2022년 02월 23일 13시 41분 41초에 업로드 된 글입니다.
    작성자: sooooong_minseok

    0과 1이 하나의 비트로 이루어져 있다.

    2X 2X 2X 2X 2X 2X 2X 2

    2^8은 1바이트로 하나의 단위를 구성하며, 1바이트는 256가지의 수를 표현할 수 있다.

    자료형의 형태에 따라 부호가 유무가 달라진다. (unsigned = 양수, signed = 음수 포함) 

    1바이트 자료형 char를 예시로 들어보자.

    unsigned char = 0~255, signed char = -128~127

    1바이트의 크기는 같지만 표현하는 범위가 달라진다.

    이런 차이가 발생하는 이유는

    unsigned의 경우, 8개의 비트를 모두 활용할 수 있고

    반면 signed의 경우, 최상위 부호 비트와 7개의 비트를 활용하기 때문이다.

     

     

    만약 양수와 음수를 구분짓는다면, 2진법에서 최상위 부호 비트가 0인 경우 양수, 1인 경우 음수이다.

    예시.

    0 - - - - - - -

    >>양수

    1 - - - - - - -

    >>음수

     


    그럼 아래 예시는 뭐라고 나타내야 하는가?(조건, 음수 표현을 한다.)

    1 0 0 0 0 0 0 1

    -1이라고 할 수 있는가??

    전혀 틀린 말이다.

     

    >>

    컴퓨터는 내부에서 덧셈만 가능하기 때문에 뺄셈은 보수를 이용하여 덧셈이 가능하게 변경한다.(음수의 덧셈)

    예를 들어 -10이라는 숫자를 표현한다고 하자.

    -10을 표현하기 위해서는 10 + (-10) = 0이 되는 형태가 되어야 한다.

    즉, 10에 어떤 숫자를 넣어야지 0이 되는지를 표현한 것이 컴퓨터가 생각하는 음수이다.

     

    위와 같은 형태를 만들기 위해서, 2의 보수법을 활용해야 한다.

    2의 보수는

    1의보수 (2진법을 뒤집어 변환( 0<->1) 하고)를 하고 마지막 1을 더하면 된다

    아래 예시를 통해 이해해보자.

    최상위 부호비트는 음수라고 하자.

    1 0 0 0 0 0 0 1

    단순한 생각으로는 -1라고 생각하기 쉽다. 그러나 틀린 말이다.

    2의 보수법을 진행해보자.

    0 1 1 1 1 1 1 0

    먼저 1의 보수법, 0<->1를 변환한다.

    0 1 1 1 1 1 1 1

    마지막으로 1을 더한다.

     

    1000/0001 + 0111/1111 = 0이 나온다.

    10 +(-10) = 0이라는 예시와 일치하는 것을 볼 수 있다. 

    위 2진법을 십진수로 표현하면 -1이 아니라 -127이다.


    또 다른 예시.

    unsigned char i = 255;를 출력하면 255가 나온다.

    그러나 signed char j = 255;를 출력하면 -1이 나온다.

     

    같은 부호비트의 형태를 갖추고 있지만 음수연산(2의 보수법)을 거치고 나면 다른 값이 나온다는 것을 의미한다.

    즉 컴퓨터 상 2진법 형태의 255와 -1는 비트상 같은 구조를 가지고 있다.

    그러나 자료형이 양수이냐? 음수이냐?에 따라 전혀 다른 값이 할당되어진다.

    1 1 1 1 1 1 1 1

    양수만 표현하는 unsigned char에서는 255가 값으로 할당된다.

    그러나!

    음수를 함께 표현하는 signed char에서는 -1이라는 값이 할당된다.

    1의 보수법을 한뒤,

    0 0 0 0 0 0 0 0

    +1을 하면

    0 0 0 0 0 0 0 1

    로 십진법으로는 1이 나온다.

    즉 1111/1111은 음수 표현에서는 -1로 표현된다는 것을 의미한다.

    같은 비트의 형태지만 음수 자료형에서 표현되는 형태로 바꾸면 다른 값이 나온다.

     

     

     

    결론.

    비트의 형태가 같더라도 자료형의 표현범위가 양수인지 음수인지에 따라 값이 전혀 다르다.

    양수라면 그대로 표현하면 되지만, 음수의 경우에는 2의 보수법을 활용하여 전혀 다른 형태의 값이 나올 수 있다.

    차이가 발생하는 이유는 컴퓨터가 덧셈만을 활용한다는 특징때문이다.

    10+(-10)=0이라는 형태가 일치해야만 음수라고 표현된다.

     

    이것을 활용하기 위해 2진법에서는 2의 보수법을 활용한다.

    2의 보수법이란 1의보수법을 한 후, +1를 해준다.

     

    2의 보수법을 거친 비트는 원래 비트와의 합이 0이 된다.

    즉, 보수법을 거친 비트는 원래 비트의 대비되는 음수가 되었다는 것을 의미한다.

     

    나의 느낀 점.

    처음에는 char라는 범위를 1바이트 255가지범위와 -128~127이라는 범위로 나뉘고

    이 이상의 범위로를 넘어가면 오버또는 언더플로우가 발생하면서 다시 한바퀴를 회전한다는 개념으로 이해했다.

    그러나 위와 같은 방식으로 이해를 해보자면, 

    같은 비트 형태를 가지고 있더라도 자료형의 형태에 따라 다른 값을 추출한다는 사실 역시 알 수 있다.

    반대로 생각하면 값이 달라도 자료형의 형태에 따라 같은 비트형태를 가지고 있을 수 있다.

     

    +

    signed 부호가 있는 형태에서 최상위 부호 비트라는 형태를 따로 빼면서 양이 반으로 줄어든다는 점.

     

    댓글