본문 바로가기
💻 컴퓨터 시스템

컴퓨터에서의 정수표현 (부호있는 정수, 2의 보수)

by 비타민찌 2021. 7. 20.
728x90

 

컴퓨터에서는

정수, 실수, 문자, 이미지, 동영상소리

 

어떻게 표현하는가?

 

 

 

 

오늘은 컴퓨터 내부의 데이터 표현에 대해 생각해 보려고 한다.

우리가 지금 보고 있는, 무수히 많은 문자, 이미지, 소리, 영상...

어떻게 컴퓨터에 저장되어 있고, 어떻게 우리에게 보여줄 수 있는걸까?

컴퓨터 내부의 데이터 표현.. 덜컥 말이 어렵지만, 풀어서 잘 생각해보면 너무나 궁금한 것이다.

이번 포스팅에서는 컴퓨터에서 '정수'를 표현하는 법에 대해 알아보려고 한다.

 

 

진법 변환에 대해 알고 있다면, 해당 포스팅을 이해하기 더 쉽다.

 

 

정수표현 

우선 이 두가지로 구분하면서 시작하자.

부호없는 정수(Unsigned integer) ,

부호있는 정수(signed integer).

 

부호 없는 정수는 말 그대로 부호 -나 +가 존재하지 않는 숫자 세계를 나타낸다.

0과 자연수의 표현.

 

그리고 부호 있는 정수는 음수, 0, 양수 더 넓은 숫자 세계를 표현하는 것이다.

 

그럼 이제 우리에게 8비트 공간이 주어졌다고 생각해보자.

 

Unsigned integer : 부호없는 정수

_ _ _ _ _ _ _ _ ( 8 비트 공간 )

부호가 없는 비트는

부호가 없으니 위 비트 공간 빈칸에 넣을 수 있는 숫자, 즉 표현 가능한 숫자는

0000 0000 ~부터~ 1111 1111이다.

이진법을 우리가 사용자는 10진법으로 변환해 주면 0000 0000은 0이고 1111 1111은 255.

즉 무리없이 0부터 255를 표현할 수 있다!

 

 

그럼, 부호있는 정수도 이렇게 간단하게 생각해보자.

조금 더 작게 4비트 공간이라고 생각하고,

_ _ _ _

그런데 여기서 의문이 하나 생긴다 !!

- , +. 이 부호는 어떻게? 어디에?

표현해야하는 걸까?

 

 

Signed integer : 부호있는 정수

 

그래서 사람들이 고안해낸 방법은

우선 맨 앞 칸에 적어두자는 거였다.

 

부호, ㅡ, ㅡ, ㅡ, ㅡ

요렇게.

 

그냥 생각했을때는 무리 없을까? 싶지만,

예시로 여기에 16을 넣어보자.

16은 2진법으로 10000인데, 4칸에 넣자니 앞의 1이 하나 튀고 만다.

이대로 컴퓨터에 넣어버리면 컴퓨터는 주어진 딱 4칸밖에 읽지 못해서 우리가 넣은 16을 그냥 0으로 계산해버리게 된다...!!

흠.. 표현가능한 범위를 벗어나

Overflow 라는 문제가 발생한다.

 

그래서 사람들은, 부호만을 표현하는 부호자리 를 따로 하나 만들자고 약속한다!

 

 

Signmagnitude : 부호절대값

 

 

 

부호 크기

ㅡ ㅡㅡㅡ

 

부호를 뜻하는 Sign의 S를 따서

S의 자리를 만들고, 뒤에는 수의 크기를 나타내는 M의 자리를 만든다.

 

부호는 음수(-) 일 때, 1로 표기.

양수(+) 일 때, 0 으로 표기하기로 한다.

 

이렇게하면 표현가능한 숫자는 0000~1111(0~16)이 되고, 앞의 S 칸으로 음수와 양수를 구분할 수 있게 된당!

그치만 여기서도 문제가 발견된다.

 

-1과 +1을 더하면 당연히 0이 되어야 할 계산에서,

(Magnitude 부분만 봄)

 

0 / 0 0 0 1 = +1

+ 1 / 0 0 0 1 = -1

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

1/ 0 0 1 0 = -2....

 

음수를 더할때, 음수를 표현하는 앞의 1이 그냥 0과 더해져서 (몬말인지 알죠?)

1 0010, -2가 나와버리는 문제가 발생한다.

계산시에도 문제가 되고, 0을 표현하는 방식이 +0과 -0 두 가지가 존재하게 되어버린다.

 

1의 보수 💡

그래서 이를 해결하고자,

1의 보수 방법은 주어진 이진수의 0은 1로,

1은 0으로 대체한 수로 부호 절대값 방식에서 음수의 순서를 뒤집는 1의 보수 방법을 쓰기로 한다.

 

부호는 음수(-) 일 때, 1로 표기하고, 양수(+) 일 때, 0 으로 표기하기로 한 성질을 유지하면서,

음수와 양수를 단순히 더하는 방식으로 뺄셈을 구현할 수 있다.

 

간단하게 말해 그냥 앞 칸이(부호)가 1일 경우, 음수처리를 해두고 숫자를 다 반대로 바꿔주는 것.

말이 복잡하니 숫자로 표현해보자.

 

* 일반 양수의 계산

2 + 3 =

0010 + 0011 =

0101 = 5.

 

* 1의 보수 표현으로 계산.

-2 + -3 =

 

1101 + 1100 =

(아까 양수의 2, 3에 숫자만 뒤집어 준 것)

 

1001 + 0001(자리올림 비트) =

(여기서 자리올림이 발생하면 그냥 평소처럼 왼쪽으로 올리는 것이 아니라,

최하위비트, 즉 가장 오른쪽 비트에 1을 더해주어야 한다!)

1010 = -5

 

* 1의 보수 표현으로 계산2.

0 0 0 1 = +1

+ 0 0 0 1 = -1

 

(1의 보수표현으로 바꿔주고, 다시 계산)

 

0 0 0 1 = +1

+ 1 1 1 0 = -1

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

1 1 1 1 = 0

 

모두든 계산에서 정확한 값이 나온다!

그럼 이 2의 보수 표현을 써도 되는걸까? 문제가 없을까?

 

우리에게 3비트의 공간이 주어졌다고 생각해보자 !

3비트 공간에서 표현가능한 수가 몇개 인가~?

나열해 보도록 한다.

이렇게 비트로는 8개가 나오는데, 000과 111이 각각 +0과 -0을 나타내기 때문에

사실상 표현가능한 수는 7개가 되는 문제가 생긴다.

 

예를 들어 1001(십진수 -1) + 0001(십진수 1) = 1010인데, 실제로는 0이 되어야 한다.

그리고 또 0을 표현하는 방식이 +0과 -0 두 가지가 존재하게 된다.

 

이건 또 어떻게 해결해야할까?

 

 

2의 보수 💡

2의 보수는 방금 공부한 1의 보수에 1만 더해주면 된다.

예를 들어 0011(3)의 2의 보수는 다음과 같이 구할 수 있다.

 

* 0011 => 1100(1의 보수) + 1(2의 보수) => 1101

 

아래는 2의 보수표현에 대한 누군가의 질문인데,

2의 보수가 1의보수+1 인데 그러면 2번문제에서 2의보수가 1의보수+1 인데 그러면 답이 1002아닌가요? ㅠㅠ

왜 1010이 되는지 설명부탁드립니다 ㅜㅜ 이해가 안가네용

 

뭔가 귀엽기도하고 딱 떨어지는 대답이 달려서ㅎㅎ

하여간 2의 보수표현은 이렇다!

 

 

그래서 정수표현에서 표현 가능한 범위를 정리해보자면,

 

• 부호 없는 정수 : Unsigned integer

0 ~ 2n-1 +,- 구분이 불가능 하다.

 

Sign and Magnitude

-(2n-1-1) ~ 2n-1-1 요건 0이 두개나 되는 문제가 있었다

 

• 2’s Complement

-2n-1 ~ 2n-1-1 연산할 경우 중간 과정이 복잡해지긴 한다.

 

 

 

 

그럼 이어서 다음 포스팅에서는 실수의 표현에 대해 알아보도록 하자.

 

728x90

댓글