컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 3[2진수 정수의 표현, 보수와 음수] (Bit, Byte, Kb, Mb... etc)

2017. 10. 16. 15:03Programming/Etc...

안녕하세요! Nitro입니다.

지난시간 "컴퓨터의 수, 컴퓨터의 저장 단위에 대해 알아보자! Part 2[비트부터 시작하는 정보 단위]" 에서 뿌렸던 떡밥(?)

기억하십니까?


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

먼저 1비트가 8개가 되어, 8비트가 되면 1바이트로 표현할 수 있습니다!

최대 255까지의 숫자를 나타낼 수 있습니다.

이건 나중에 다룰 내용이지만,

 정수표현에서는 1바이트의 가장 앞 비트 하나를 부호비트로 처리하여 -128 부터 128까지의 숫자를 표현할수 있습니다.

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


바로 이거인데요.


오늘은! 바로 2진수의 정수표현과 보수, 그리고 음수표현에 대해 알아봅시다!



일단 시작하기 전 하단의 프로그램을 작성해 봅시다.



Label1.Text = "int16 : " & Int16.MinValue & " ~ " & Int16.MaxValue Label2.Text = "unsigend int16 : " & UInt16.MinValue & " ~ " & UInt16.MaxValue Label3.Text = "int32 : " & Int32.MinValue & " ~ " & Int32.MaxValue Label4.Text = "unsigend int32 : " & UInt32.MinValue & " ~ " & UInt32.MaxValue Label5.Text = "int64 : " & Int64.MinValue & " ~ " & Int64.MaxValue Label6.Text = "unsigend int64 : " & UInt64.MinValue & " ~ " & UInt64.MaxValue

위의 소스코드를 입력한 프로그램을 실행시켜보면


위와 같은 결과를 얻으실 수 있습니다.

이게 뭐냐구요?


MsgBox(2 ^ 32)

위의 짧은 소스코드를 FormLoad 부분에 추가시켜줍시다.


그럼, 하단과 같은 값을 얻으실 수 있습니다.


몇몇분들은 알아냈을 꺼라 생각합니다.

int형 32비트 변수는 2진수 1비트가 32개 있는것.

즉 최고로 저장가능한 숫자가 약 42억(4294967295)이 된다는 것 입니다.


하지만 위위의 사진.

int32 는 -2147483648 ~ 2147483647인것이 보이시나요?

그렇습니다.

실제로 int32형 변수는 약 -21억부터 21억까지의 숫자를 저장할 수 있습니다!

이게 무엇을 의미하는걸까요?


[프로젝트 파일]

2진수의 정수표현과 보수, 음수표현.zip


그걸 지금부터 알아보도록 하죠.


일단, 위 사진은 10011101 이라는 1바이트(8비트)의 수 입니다.

128 + 16 + 8 +4 + 1 = 157

즉 157이라는 숫자를 가지고 있죠.



하지만 이미 앞서 언급한것처럼 프로그램에서의 정수숫자는 음수를 표현합니다.

하.지.만


0과 1, 그리고 덧샘밖에 하지 못하는 컴퓨터가 어떻게 음수를 표현할 수 있을까요?

바로 저번애 뿌렸던 떡밥, "부호비트"입니다.

1바이트에서 가장 첫번째 1비트는 부호비트를 의미합니다.


부호비트가 0일경우는 양수를, 1일경우는 음수를 나타냅니다.

이 부호비트를 MSB(Most Significant Bit)이라고 하는데, 가장 중요한 비트 라는 뜻을 가지게 됩니다.


그렇다면, 

10011101은 몇일까요?



아레 숫자를 예로 설명해 보겠습니다.

00001101이라는 2진수의 수는 10진수로 13을 의미합니다.

이놈을 음수로 만들려면 부호비트를 1로 만들면 될까요?


땡! 10001101은 -13이 아닙니다...

뭐든지 증명이 중요한법.


증명해 봅시다.


초등학교를 나왔다면, 13 + (-13) = 0 이라는것을 아실 수 있습니다.

하지만 위에서도 보이듯, 00001101 + 10001101은 00000000이 아닙니다.

(여기서 버림값은, 8비트에서 밀려나가 9비트에 위치하기때문에, 컴퓨터상에서는 지워버립니다. 즉 의미없음.)

즉 위에 결과를 보면 알듯, 10001101은  -13이 아닌거죠.


그렇다면, 어떻게 양수를 음수로 바꿀수 있을까요?

여기서 보수라는것이 나오게 됩니다.

하단의 이미지를 보도록 하죠.

일단 양수를 음수로 바꿀려면 숫자를 반전해야 합니다.

0은 1로, 1은 0으로 바꿔주는거죠.

이 과정을 "보수"라 합니다.


이렇게 원래의 숫자에 보수를 취해준 다음, 1을 더해줍니다.


그럼 11110011이라는 값이 나오고, 이 값은 -13이 됩니다.



다시 한번 증명해 봅시다.

00001101은 10진수로 13 입니다.

만약, 11110011이 -13일 경우 00001101에다가 11110011을 더한다면 100000000 이 되야하고,

9비트 자리로 튕겨저 나간 1은 버림값으로 지워서 00000000이 됩니다.

마치 위의 사진처럼요.



자 그렇다면 처음의 질문을 다시 한번 던져봅시다.

10011101은 몇일까요?

일단 MSB가 1인것으로 보아 음수인건 확실해 보입니다.


아까 우리가 양수를 음수로 바꿀때 어떻게 했었죠?


[보수를 취함 -> 1을 더함.]

이라는 순서를 지녔죠.


그렇다면. 음수에서 양수로 바꾸는것은 그것의 역순을 취하면 되겠죠?


일단 [1을 빼줌 - > 보수를 취함] 이면 되겠죠?

그럼 위 사진처럼 됩니다.

10011101에서 -1 = 10011100이 되고,

이것을 반전시키면 01100011이 되죠!


01100011은 99가 됩니다!


즉. 10011101은 -99가 되는것입니다!


01100011 = 99

 10011101 = -99

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

(1)00000000 = 0


이 되어서 증명도 끄읏!

이렇게! 오늘의 강좌는 끝이 났습니다!

오늘은 드디어 2진수 정수의 보수와 음수표현, 그리고 변환방법에 대해 알아보았습니다.

소수표현은 알려드릴지는 잘 모르겠습니다만... 알려는 드려야 하는데;;


뭐 어찌되었든!

오늘강좌는 여기까지 이구요! 다음에 뵙도록 합시다!

오류, 오타 지적 환영합니다! (그리구 댓글도!!!)

그럼 이만. 다음에 뵙시다!

바이바이~!


반응형