코딩기록

항해 10일)CS- 1장 정수를 비트로 표현하는 방법 본문

항해99/CS 스터디팀 그라우해(6주)

항해 10일)CS- 1장 정수를 비트로 표현하는 방법

뽀짝코딩 2022. 1. 18. 21:22
728x90

순서

정수를 비트로 표현하는방법

 

1.  양의 정수 표현

  • 10진수
  • 2진수

2.  2진수 덧셈

 

 

3.  음수 표현

  • 부호와 크기
  • 1의 부호
  • 2의 부호

 

 

 

정수를 비트로 표현하는 방법

 

1.  양의 정수 표현

진법이란 사용할 수 있는 숫자의 갯수와 자리값을 정의해 주는 수 체계

 

10진수 

일상에서 사용하는 0 ~ 9까지의 10가지 기호인 숫자

   

10진수 숫자를 상자라 했을때 아래 표처럼 오른쪽에서 왼쪽으로 쌓이고 각 이름들은 10의 거듭제곱에 해당한다.  

5,028이라는 수의 값은 각 상자에 든 내용물의 값과 상자의 값을 곱한것을 모두 더해서 결정된다.

10진수는 5와 1000의 곱에 0과 100의 곱, 2와 10의 곱, 8과 1의 곱을 합한 값을 표현한다.

                             5, 0 2 8

수식 :  5 X 10³  +  0 X 10²  +  2 X 10¹  +  8 X 10⁰

         5 X 1000 + 0 X 100  +  2 X 10   +  8  X 1

               <<< ------------------------------------------------


10진 표현법으로 표현한 수 5,028
이름 천의 자리
1000
백의 자리
100
십의 자리
10
일의 자리
1
상자의 값 10³ 10² 10¹ 10⁰
내용물의 값 5 0 2 8
표1

 

 

2진수

컴퓨터는 10진 숫자 대신 비트를 사용한 값과 동일하게 기호 1과 0만 으로 구성되는 2진법 체계를 쓴다.

2진수에서는 기호가 2개이기 때문에 각 상자는 자신의 오른쪽에 있는 상자의 자릿수에

2를 곱한 값의 자리를 표현한다. 즉 2의 거듭제곱을 한다.

              <<< ------------------------------------------------

자릿수 2의 자리 일의 자리
2⁰
표2

    

 

                                                                     가장 오른쪽의 비트

* 아래표는 5,028을 2진수로 표현한 표이다. *               가장 작은 유효 비트 (Least Significant Bit) -

 LSB 

2진수로 표현한 5,028
2의 제곱 2¹² 2¹¹ 2¹⁰ 2⁹ 2⁸ 2⁷ 2⁶ 2⁵ 2⁴ 2⁰
2진수 1 0 0 1 1 1 0 1 0 0 1 0 0
10진수 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
표3

가장 왼쪽의 비트                                                                                  -자세한 설명은 아래 추가 설명에서-

가장 큰 유효 비트 (Most Significant Bit) -  MSB 

 

2진수 변환 결과는 다음과 같다.

수식 : 1 X 2¹²  +  0 X 2¹¹  +  0 X 2¹⁰  +  1 X 2⁹  + 1 X 2⁸  +  1 X 2⁷  +  0 X 2⁶  +  1 X 2⁵ +  0 X 2⁴  +  0 X 2³  +  1 X 2²  + 0 X 2¹  + 0 X 2⁰ = 5,028

10진수로는 5,028이 네 자리 숫자라고 말할 수 있다. 2진수로는 5,028이 13비트 수가 된다.※

 

 

 

 

 

 16비트 2진수로 저장한 5,028          <<------- LSB 

0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
표4

 MSB  -------->>

10진수와 마찬가지로 가장 왼쪽에 있는 상자보다 더 왼쪽에 영(0)을 추가하면(이런 식으로 추가된 영들을 리딩제로 leading zero라고 말한다) 어떤 값을 표현하는 데 필요한 최소한의 상자 개수보다 더 많은 상자를 추가할 수 있다. 10진수에서 05,028과 5,028은 같은 값을 표현한다. 컴퓨터가 미리 정해진 수의 비트를 한 덩어리로 사용하도록 만들어졌기 때문데, 2진수를 쓸때는 이런 식으로 항상 일정한 개수의 비트를 사용해 값을 표현하는 경우가 종종 있다.

 

 

 

 

-추가 설명-

10진수를 2진수로 변환하는 방법

10진수 11을 2로 나눈 나머지를 2진수의 첫째자리에 오게 하고, 몫은 다시 2로 나누어 나머지를 2진수의 둘째자리에 오게하고 ... 마지막에 2미만이 된 몫을 2진수의 맨 왼쪽에 놓으면 된다.

2진수로 11은 1011이 된다. 

 

 

잠깐!!!!  QUIZ

  → 5,028을 2진수로 표현하면?  

답은 2진수 '2진수로 표현한5,028'  표에서 확인가능하다.

 


2. 2진수 덧셈

10진 덧셈에서는 오른쪽(가장 작은 유효 숫자)에서 왼쪽으로 각 자리의 숫자를 서로 더한다. 결과가 9보다 크면 1을 올린다. 마찬가지로, 2진수에서도 각 비트를 LSB에서 MSB 쪽으로 더하며 결과가 1보다 크면 1다음 자리(왼쪽)로 올린다.

 

                                    <------------------- 오른쪽 LSB부터 더한다.

1   
0
¹  
0
  
1
5 1 0 1
6 1 1 0
표4

 * 오른쪽 부터 1+1= 10에서 0을 내리고 1을 왼쪽으로 올린다.  2진수는 0과1만 표현되기 때문에 2라는 기호가 없고 1+1= 10으로 표현,

   위로 올라간 수를 carry(오렌지색 숫자)라고한다. 

 

 

논리연산을 사용한 2진 덧셈

 <<< ------------------------------------------------ A, B 진행 방향
A B A AND B A + B A XOR B A B
0

0

1

1
0

1

0

1
       0     ---

       0     ---

       0     ---

       1     ---
-->  00  <--

-->  01  <--

-->  01  <--

-->  10  <--
---      0    

---      1    

---      1    

---      0    
0

0

1

1
0

1

0

1
표5-1
A AND B 1 0 0 0

A
 ( ¹ ↑)    
1
( ⁰ ↑)  
1
( ⁰ ↑)  
0
( ⁰ ↑)  
0
B 1 0 1 0
A XOR B 0 1 1 0
표5-2

 

추가

2진수의 뺄셈

2진수의 보수는 1의 보수와 2의 보수가 있다.

각각의 보수를 사용한 뺄셈

[Digital design] 보수와 2진수의 덧셈과 뺄셈 (tistory.com)
[Digital design] 보수와 2진수의 덧셈과 뺄셈 (tistory.com)

 

 

 

 

 

 

 

 

 

오버플로 overflow  

덧셈 결과가 우리가 사용할 비트의 개수로 표현할 수 있는 범위를 벗어나면 어떻게 해야 할까? 이런 경우 

오버플로 overflow 가 발생한다.  즉, MSB에서 올림이 발생했다.

1001(9₁₀) + 1000(8₁₀) = 10001(17₁₀)이된다. 하지만 4자리 비트라 1개가 부족하여 0001(1₁₀)가 되는 경우가 있다.    

* 1001: 2진법  / (9₁₀): 10진법 9의10승  

carry + overflow

 

 

언더플로 underflow

MSB 위쪽에서 1을 빌려오는 경우.

산술연산의 결과가 취급할 수 있는 수의 범위 보다 작아지는 상태를 말한다.

 

 


3. 음수 표현

1). 부호와 크기

음수와 양수를 구별하기 위해 흔히 부호sign를 사용한다.

가장 왼쪽 MSB가 0이면 양부호(+), 1이면 음부호(-)라 한다.

2진수에서 4비트중 남은 3비트를 사용하면 0부터 7까지의 총15가지의 수를 표현할 수 있다.

(주의 양수 0과 음수 0은 똑같은 0이다. 16가지X.)

 

-부호와 크기 표현법

   한 비트를 부호에 사용하고 나머지 비트를 수의 크기, 즉 0부터의 거리(절댓값)를 표현하기 위해 사용하는 방법

-문제점

   ① 0을 표현하는 방법이 두 가지라서 비트 구성에 비용이 낭비된다.

   ② 부호와 크기 표현법을 상용하면 XOR과 AND를 통한 덧셈 계산이 불가하다.

 

 

                                                                                                                2진수 부호와 크기 표현법

부호 2⁰ 10진수 부호 2⁰ 10진수
0 1 1 1 +7 1 0 0 0 -0
0 1 1 0 +6 1 0 0 1 -1
0 1 0 1 +5 1 0 1 0 -2
0 1 0 0 +4 1 0 1 1 -3
0 0 1 1 +3 1 1 0 0 -4
0 0 1 0 +2 1 1 0 1 -5
0 0 0 1 +1 1 1 1 0 -6
0 0 0 0 +0 1 1 1 1 -7
표5

*4비트 음수, 양수의 부호만 다르고  남은 3비트 수 자체는 같다.  양수7 >111  /  음수7 > 111

 

 

                                                      부호와 크기 표현법을 사용한 덧셈표

+ 0 0 0 1 +1
1 0 0 1 -1
1 0 1 0 -2
표6

 

표를 보면 0001은 부호 비트가 0이기 때문에 1을 2진수로 표현한다. 1001은 부호 비트가 1이기 때문에 -1을 2진수로 표현한다. 이 두 수를 XOR과 AND를 사용한 산술 방식으로 계산하면 1010이 된다. 이 값을 10진수로 바꾸면 -2인데, -2는 +1과  -1을 더한 값이 아니다.

 

 

 

 

2). 1의 보수

  - 양수의 모든 비트를 뒤집는 것

  - NOT 연산을 통해 해결

출처: tcp school

 

문제점

  1) 0을 두가지 방식으로 표현한다. (0이면 + , 1이면 - )

  2) 덧셈을 쉽게 할 수 없다.

       => 해결법: MSB 쪽에서 올림이 발생한 경우 LSB로 올림을 전달해야 하는데 순환올림을 사용하면 되지만 복잡하고

                      순환올림을 처리 할 하드웨어를 추가해야 한다.

   

   *순환올림 : +2와 -1을 더하면  0010 + 1110 는 일반 덧셈처럼 해서 10000인데 4비트 밖에 없기 때문에 MSB를 넘는 1을 LSB로 넘겨줘서 0001로 표현하는 것

¹  

¹   
0
¹   
⁰    
1

0

+ 2
 
+ 1 1 1 0 - 1  
  0 0 0 0   0  
  0 0 0 1   1 순환올림
+ 0 0 0 1 + 1  
표7

** 현대 컴퓨터에서는 부호와 크기 표현법이나 1의 보수 표현법은 모두 사용하지 않는다. 이 두 방식을 사용한 계산은 추가적인 하드웨어 없이는 제대로 작동할 수 없고, 하드웨어를 추가해야 한다는 말은 비용이 더 든다는 뜻이기 때문이다.

이런 문제를해결하는 표현법을 살펴보자.

 

 

 

3). 2의 보수

  - +1을 더했을 때 0이 나오는 비트 패턴을 찾고 그걸 -1이라고 하는 것을 말한다.

 4비트 수의 경우 +1은 0001이다.

0001에 1111을 더하면 10000이고 2의 보수에서는 MSB의 올림 1을 버린다.

즉, 0000이 되므로 1111이 -1이되는 것이다.

  2의 보수 표현법                                                                         


   +  1

   -   1

       0
¹   
0
¹   
0
¹   
0
⁰    
1
1 1 1 1
0 0 0 0
표8

 

 

2의 보수 표현 법
  1) 어떤 수의 비트를 구한다. (음수 양수 상관없음)
  2) 그 비트에 NOT을 적용해서 뒤집는다.
  3) LSB(1비트)에 1을 더한다.

위의 방법대로 해보면 숫자 +5를 4비트로 표현하면 0101인데 이걸 NOT을 적용하면 1010이고 여기에 1을 더하면

1011이다. 따라서 -5는 1011이다. 

                                                                                             2진수 2의 보수                      

부호 2⁰ 10진수 부호 2⁰ 10진수
0 1 1 1 +7 1 1 1 1 -1
0 1 1 0 +6 1 1 1 0 -2
0 1 0 1 +5 1 1 0 1 -2
0 1 0 0 +4 1 1 0 0 -4
0 0 1 1 +3 1 0 1 1 -5
0 0 1 0 +2 1 0 1 0 -6
0 0 0 1 +1 1 0 0 1 -7
0 0 0 0 +0 1 0 0 0 -8
표9

잠깐!!!!  QUIZ

  → +7을 2진수 2의 보수 표현법을 적용하면?  

답은 +7찾는다  0111   >   뒤집는다 1000   > 1더한다  1001( 표9에서 -7확인!)     

 

 

2의 보수에는 0이 1개의 역할만 가지고 있다.

0을 비트로 나타내면 0000이고 NOT을 적용하면 1111이다.

여기에 1을 더하면 10000인데 MSB 올림을 버리므로(오버플로-2진수 덧셈) 0000이 남는다. 

0000은 0과 동일하므로 2의 보수에는 0이 1개의 역할만 가지고 있다.

 

 

비트의 개수가 커지면 표현 할 수 있는 값의 범위가 증가한다. 이번에 배운 내용 중에 우리가 같은 숫자로 이뤄진 수를 보더라도 표현 방식에 따라 값이 달라질 수 있다는 점을 꼭 염두에 둬야 한다. 

2진수 1111은 2의 보수 에서는        -1이지만 

                  부호와 크기 표기로는  -7이고 

                  1의 보수 에서는         -0이다.

 

 

 

 

 

 

 

출처

*책 - 한 권으로 읽는 컴퓨터 구조와 프로그래밍

*블로그

10진수를 2진수로 변환, 2진수를 10진수로 변환 이렇게! | 의미 하나 (tistory.com)

 

*오버플로,언더플로

간단그린설명- https://codedragon.tistory.com/7948

자세한설명- https://blog-of-gon.tistory.com/90

* 2진수 덧셈과 2의 보수

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=xxrcn11&logNo=20140446588

정수를 비트로 표현하는 방법 (tistory.com)

* 2진수 뺄셈

꿈꾸는느티나무 :: 2진법 연산 - 빼기 (tistory.com)

* 2진수의 보수별 뺄셈

[Digital design] 보수와 2진수의 덧셈과 뺄셈 (tistory.com)

 

 

 

 

반응형
Comments