본문 바로가기
Computer Science/컴퓨터공학(김용담 강사님)

정수(signed, unsigned)와 부동 소수점 표현 in 컴퓨터

by 코듀킹 2023. 4. 12.

1. 정수의 부호 표현: signed, unsigned

  1. signed integers(정수): 양수, 음수, 0을 모두 표현할 수 있다. 첫 번째 비트는 부호 비트로, 0은 양수를, 1은 음수를 의미한다.
  2. unsigned integer(자연수 & 0): 양수와 0만 표현할 수 있다. 따라서, 모든 비트를 숫자의 표현에 사용한다.

정수가 signed인지 unsigned인지에 따라서 표현 가능한 숫자 범위가 다르기 때문에 주의해야 한다. 예시들어, 1바이트(=8비트)를 10진수의 unsinged로 표현하면, 0부터 255까지의 값를 표현할 수 있다. singed같은 경우에는 -128부터 +127까지의 값을 표현할 수 있다.

이걸 2진수로 표현하면 아래와 같다.

 

signed integer

  • 11111111: -1
  • 00000000: 0
  • 01111111: 127
  • 10101010: -86

unsigned integer

  • 11111111: 255
  • 00000000: 0
  • 10101010: 170
  • 01100100: 100

이 걸 보면, unsigned integer의 이진수 표현 방법은 알겠는데, signed integer의 이진수 표현은 어떻게 되는지 이해가 안갈 수 있다. 이는 2의 보수라는 개념이 들어간다. 2의 보수란, 컴퓨터에서 음수를 표현하는 데 사용되는 방법으로, 어떤 수의 보수(complement)를 취한 후 1을 더해서 표현한다.

 

예를 들어, 8비트 signed integer에서 -3을 2의 보수로 나타내보자.

  1. 3을 2진수로 변환 : 3 = 00000011
  2. 모든 비트를 반전 : 00000011 → 11111100
  3. 1을 더함 : 11111100 + 00000001 = 11111101

따라서, -3을 8비트 signed integer에서 2의 보수로 나타내면 11111101이다.

 

 

2. 부동 소수점 표현(Floating-point representation) (IEEE 754)

컴퓨터에서 실수를 표현할 때, 부동소수점(floating-point) 방식을 사용한다. 이는 IEEE 표준(IEEE 754)으로 전 세계적으로 약속되어 있는 방식이다. 이 방식의 프로세스는 다음과 같다. (32비트 기준으로 설명하겠다.)

 

1. 십진수를 2진수로 바꾼다. 이때, 정확한 값을 변환시킬 수 없기 때문에 소수점 아래 최대 23bit까지만 쓴다. 이때, 2진수의 소수점 첫 째자리(0.1)는 1/2, 즉 0.5의 값을 나타내고, 소수점 둘 쨰자리(0.01)은 1/4, 즉 0.25의 값을 나타낸다.

2. 소수점을 위에 1만 남도록 왼쪽으로 이동하고, 2의 지수를 곱해준다. 예를 들어 101101.101 값이 있다면, 1.01101101로 바꾸고, 2^5를 곱하는 형태로 만든다. ex. 1.01101101 x 2^5

3. 이 값을 32비트 안에 IEEE 표준에 맞게 넣는다. 

 

부동 수점 표현의 전체 프로세스는 이렇게 이걸 좀 더 세부적으로 나눠서 설명해보겠다. 여기서 핵심적으로 봐야할 값은 3가지로 나뉜다. 부호비트(Sign bit, S), 지수부(Exponent, E), 가수부(Mantissa, M)이다. 부호 비트는 말 그대로 + 혹은 - 부호를 나타내기 위한 부호이다. 즉, 실수의 양수/음수를 나타내며 0은 양수, 1은 음수를 의미한다. 지수부는 실수의 크기를 나타낸다. 이진수로 나타나며, 가수부가 몇 비트까지 사용될지를 결정한다. 가수부는 실수의 유효 숫자를 나타낸다. 이진수로 나타나며, 지수와 함께 실제 값을 계산하는 데 사용된다.

 

이를 공식으로 바꾸면, 이러한 공식이 나온다. 
N=(-1)^S x M x 2^E

-1에 0을 제곱하면, 1이 나온다. 그리고 -1에 1을 제곱하면 -1이 나온다. 즉, 0은 양수, 1은 음수를 뜻한다. M은 위에 예시에서 살펴보았던 1.01101101 값이다. 그리고 2^E는 마찬가지로 위 예시서 살펴보았던, 5값이 들어갔던 지수부이다. 32비트 기준의 IEEE 부동소수점 방식에서는 1비트를 부호, 8비트를 지수, 23비트를 가수로 구성한다. 이를 그림으로 살펴보자.

 

부동 소수점 표현

 

1.01101101 x 2^5 이 숫자는 양수이다. 즉, 맨 앞 부호 부분에 0이 들어간다.(1bit) 가수부(M)에는 1.~~파트는 고정이므로, 소수점 아래 값부터 채운다.(23bits) 즉, 01101101이 들어간다. 그 뒤에 남은 부분은 0으로 채운다. 즉, 01101101000000000000000이 들어간다. 지수부(E)에는 앞서 계산한 수에서 2의 지수에 bias(127)을 더해준다. 즉, 5+127 = 132이다. 그리고 이를 2진수로 변환한다. 변환된 10000100을 지수 부분에 앞에서부터 채운다. 따라서 1.01101101 x 2^5는 01000010001101101000000000000000으로 변환되어 32비트에 값이 들어간다.

 

참고로 float는 32bits, double은 64bits까지 표현이 가능하다. 즉, 더 자세한 소수점을 표현하기 위해서는 double을 써야하는데, 그러려면 64비트 컴퓨터를 써야한다.

댓글