반응형

📢 컴퓨터에서의 수표현

▼ 컴퓨터는 10진수가 아닌 2진수로 수를 표현한다. 

일반적으로 컴퓨터에서 사용되는 정수형의 종류는 char (8bit,1byte) , short (16bit, 2byte) , int(32bit , 4byte) , long (64bit , 8byte) 이다. 이중 int (32bit가 제일 많이쓰여 32bit 기준으로 설명을 하겠다.)

4byte는 32bit 이며 1bit는 0과 1중 둘중 하나로 사용을 할 수 있다. 즉 2진수로 32개의 자리수를 차지하여 숫자를 표현한다.

보통 컴퓨터언어에서 맨앞자리 그니간 맨왼쪽자리 1비트는 + - 의 부호비트로 사용한다. 따라서 양수로 표현할수있는 가장 큰 32 비트값은?

0111 1111 1111 1111 1111 1111 1111 1111(2) (0x7FFFFFFF) = 2147483647 가 된다. (여기서 0은 +라는 부호비트로 사용), 만약 숫자 3을 이진수로 뽑으면 011 이겠지만 사실상 int 형(4byte)에 담아 본다면.

0000 0000 0000 0000 0000 0000 0000 0011 이렇게 될것이다 int형의 32bit 자리수를 다채우지만 앞에가 0이라 생략이 된 것.

 

📋 컴퓨터에서 음수를 표현할 때

▼ 컴퓨터에서 음수를 표현할때는 맨앞자리가 0이면 + 1이면 -이다. 음수를 표현하는 방법은 여러가지가 잇겠지만 그중 대중적인건 2의 보수를 사용한다. 그 이유는 bit는 1개가 0과 1을 표현한다. 그러니 수를 표현하는 비트수가 많건 적건 결과는 항상 짝수이다. 그렇다보니 음수를 표현하는대있어 1의보수와 부호화 절대치방법 들은 +0과 -0이 공존하게된다. 같은 0인데도 말이다.

2의 보수의 경우 +0과 -0이 따로없고 0은 오로지 1개 그리고 음수가 숫자가 1개가 더많다. 예를들어 양수로 7까지표현한다면 음수로는 -8까지 표현이 가능하다는 말이다.  만약 java로 int형 변수에 담아 이진수로 출력하게될경우

ex ) 1111 1111 1111 1111 1111 1111 1111 1101 (2) 이렇게 표현이 될것이다. 그 이유는 java등 기타 많은 언어들은 대부분 음수표현을 2의 보수 형태로 취하고 있기 때문이다.

컴퓨터(논리회로) 가 음수를 표현하는 방법은 여러 가지가 있지만, 그중 대표적으로 3가지를 말하자면 부호화 절대치 방법, 1의보수 방법 , 2의보수 방법 이렇게 3가지가 있다.

 

📋 부호화 절대치 방법 (Sign Magnitude)

▼ 부호비트를 제외한 수를 양수로 읽고, 마이너스를 붙이는 방법 즉 이진수 000011(2) = +3으로, 100011(2) = -3으로 인식하는 것. 이는 표기하기도 직관적이고 사칙연산중 곱셈 나눗셈 할땐 매우 유리하지만, 음수의 덧셈은 양수의 뺄셈과 전혀 다른 결과라서 이를 해결하기 위해서는 피연산자의 절댓값을 서로 비교하는 추가적인 연산이 필요로 한다는 단점이 있다.

예를 들어 3 - 3 = 0 을 계산하면 000011(2) = 3과 100011(2) = -3을 이진수 계산으로 더하면 000011(2) + 100011(2) = 100110(2) = -6이 되는데, 이는 결과값으로 나와야 할 (+3) + (-3) = 0과는 다른 값이다.

 

 

📢 보수의 개념, 보수의 정의

▼보수란? 어원적 의미로는 상호 보완하는 수로, 임의의 수를 보완해주는 다른 임의의 수다.

보충해주는 수 라는 의미를 가지고있으며 컴퓨터가 뺄셈을 할 때 사용되는 개념입니다.

컴퓨터가 뺄셈을 하기 위해 이런 개념이 필요한 이유는, 컴퓨터는 뺄셈을 할 수 없기 때문입니다. (가산기만 가지고 계산을함) 가산기란 : 덧셈연산을 수행하는 논리회로 (계산기)

그럼 가산기만 가지고 사칙연산을 하는법은? +는 더하면되고 -는 보수를취해서한다, X 곱셈은 +를 n번하면되고 / 나누기는 -를 n번하면 됩니다. 이렇게 컴퓨터는 가산기만가지고 사칙연산을 다계산합니다.

10진수 10이 있을때, 6의 보수를 구하면 6+x = 10 이 되는 숫자인 x= 4 가 10에 대한 6의 보수 입니다.

즉 N이 있을때 N의 'X의 보수'를 구하라고 하면 X에 (보수)Y를 더하여 N이 나오면됩니다. (X+Y =N)의 식이나옵니다. 여기서 N의 X의 보수는 Y가 되는거지요 (6 + 4 = 10 , 10에대한 6의보수는 4)

10진수에서 2에대한 10의 보수는 8입니다. 즉 2+8 =10 그러나 2진수에서 2의 보수는 음수를 나타냅니다.

 

📋 1의 보수

※요약※
1. 1의보수는  0 -> 1   1->0 으로 나타냅니다.
2. 보수는 음수일경우만 취한다. 양수일경우 x
3. 덧셈 , 뺄셈 계산시 자리올림수 (캐리값)은 숫자 1로 바꾼다.
4. 이진수변환시 +0과 -0이 존재한다

양수의 비트들을 반전시켜서 음수를 표현하는 방법. (ex : 101011 를 1의보수로 바꾸면 010100 이 된다.)

조금더 정확하게 풀이하자면 모든비트가 1인 수 에서 빼면 나오는데.   11111(2) - 101011(2) = 010100 (1의보수) 이렇게 계산하여 나오는 수 ( - 뺄셈이지만 정확하게는 xor연산입니다. 결과는 같다.) 

ex) 3의 보수 : 011 -> 100      7의 보수 : 0111 -> 1000

위 처럼 0000 0001 이라면 1111 1110 이렇게 자리수는 지켜줘야 야 합니다. 그래야 덧셈 뺄셈 할때 혼동이 되지 않아요.

010110 - 11 일경우 자리수를 맞춰주고 ( 010110 - 000011 ) --> 음수를 1의보수로 바꿔주면 ( 010110 + 111100 ) --> 1010010  이와 같은 결과가 나오는대. 6자리수에서 덧셈으로인한 자리수 올림이 발생하여 7자리가 되었는대. 저기서 빨간색으로 칠한 부분은 캐리(carry) 라고 하며, 1의보수에선 캐리값을 숫자 1로 바꿔 더해줍니다.

( ex : 1010010 --> 010011 ) 이렇게 자리수를 다시 6자리로 맞춰주고 6자리외에 올림은 숫자1로 바꿔 저렇게 더해줍니다. 그러면 십진수로 계산을 해보면 22 - 3 = 19  --> 010110 - 11 = 010011 (2) 이렇게 결과가 나옵니다.

 

📋 2의 보수

※요약※
1. 2의보수는 1의보수에서 +1을 더한 상태
2. 보수는 음수일경우만 취한다. 양수일경우 x
3. 덧셈 , 뺄셈 계산시 자리올림수 (캐리값)은 버린다.
4. 이진수변환시 0은 하나만 존재한다

양수의 비트들을 반전시켜서 음수로 만든후 +1 을 더한다. 자세한설명은 아래 예제를 보며 습득하자.

10진수 부호화 절댓값 1의 보수 2의 보수
-4 - - 100
-3 111 100 101
-2 110 101 110
-1 101 110 111
-0 100 111 -
+0 000 000 000
+1 001 001 001
+2 010 010 010
+3 011 011 011

 

📋 1의보수 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’ 나오게 됩니다.

 

반응형

+ Recent posts