본문 바로가기
시스템프로그램

[시스템프로그램]02-1-2 정보의 표현과 활용(2)

by 케찹이 2020. 4. 20.

이제부터 정수를 표현하는 방법들을 알아볼 차례다. 정수를 표현하는 방법은 네개정도 있다. 

 - unsigned integers

 - signed-magnitude encoding

 - 1's complement encoding

 - 2's complement encoding 

사질 처음 unsigned integers은 unsigned의 정수들 범위에서 표현을 하는 것이기에 특별한 것이 없지만 단순이 sign integer를 표현하는 방법은 세개나 있다. 이중에서 제일 많이 사용하는 방법은 바로 2's complement encoding이다. 그 이유는 차차 살펴보도록 하자. 

 

처음 살펴볼 encoding은 unsigned integers이다. 사실 이 표현 방법은 그리 특별한것이 없다. 이진수로 표현된 데이터를 십진수로 바꿔보면 된다. 예를 들어 x= 0000 0111 0000 0000은 B2U(X) = 2^10 + 2^9 + 2^8 + 2^7로 표현될 수 있다. 참고로 B2U는 Binary to Unsigned란 뜻이다. unsigned가 표현 가능한 데이터의 수는 0 ~ 2^w -1이 되겠다. 그럼 4bit의 값일 경우 0 ~ 2^4 - 1= 15가 되겠다. unsigned 방식은 밑 그림처럼 표현가능하겠다. 

그 다음은 sign-magnitude이다. 여기서부터 주목할 점은 Sign bit이다. 비트중 맨왼쪽에 있는 비트를 우리는 MSB라고 부르는데 그 숫자가 0이면 양수이고, 1이면 음수를 뜻한다. 예를 들자면 0001은 MSB가 0이므로 양수이고 1을뜻한다. 

위 공식은 sign-magnitude의 공식이다. -1위의 Xw-1은 방금 말한 Sign bit를 뜻하고 나머지는 밑 동그라미에서 설명하는 방식대로 계산이 진행된다. 

위의 공식처럼 0111까지는 양수인 7이 나오고 그다음 1000부터는 음수가 시작된다. 희한점은 0이 두번에 들어간다는 점이다. 이점은 조금 꺼림직한 부분으로 남는다. 

 

그 다음은 1's complement이다. 공식은 밑과 같고 이것도 원으로 한번 쉽게 살펴보자 

뭔가 괜찮아지고 있는것 같지만 아직도 0이 두번이나 표현한다는게 마음에 걸린다. 그럼 마지막으로 2's complement를 살펴보자. 

 

드디어 0이 하나가 나왔다. 게다가 2's complement를 사용하면 음수에서 하나의 수를 더 표현할 수 있다. 여기까지 왜 2's complement를 자주 사용하는지 알았고 어떤식으로 정수가 표현되는지 살펴보았다. 

 

 

자 그럼 여기서부터 조금 재미있는 얘기들이다. 우리가 같은 데이터를 전달하지만 unsigned을 표시하거나 2's complement를 표현하면 값이 서로 다르게 나온다. 

UMin = 0값은    [000...00]

UMax = 2^w -1  [111..11]

반면 2's complement는 

TMin = -2^(w-1)  [100..00]

TMax = 2^(w-1) - 1  [011..11] 값을 갖게 된다 

여기서 각 표현방법의 최대값과 최소값에 주목을 해야되기도 하지만 UMax값과 -1값의 표현을 주목해봐야 한다. 조금만 생각해보면 흥미롭게도 모두 [1111...1111]이 될것이다. 

관찰결과 |TMin| = TMax + 1이고 UMax = 2 * TMax + 1이 된다. 이러한 점들 모두 조금만 생각을 해보면 알 수 있다. 

C 프로그래밍중 #include<limits.h>를 사용하게 되면 이러한 표현들의 최소값 최대값을 모두 알수 있다. 물론 각 기계의 환경마다 값은 다르게 나올 수 있다. 

 

여기까지 였고 다음 게시물에선 type conversion부터 시작하겠습니다. 

댓글