실수형은 IEEE의 부동소수점 형식을 사용하는데 4바이트(32비트) 표현의 경우 아래와 같이 이루어져 있다.
정수의 경우 2의 보수법을 이용해서 간단하게 메모리에 저장된 비트를 확인할 수 있지만 실수는 조금 더 복잡하다.
아래의 단계를 거치면 실수가 메모리에 어떻게 표현이 되는지 알 수 있다. 위에 나와있는 -101.625를 컴퓨터의 표현 방법으로 바꿔보겠다
1단계 - 이진수로 바꾸기
이진수로 바꾸기 위해서는 나눗셈과 곱셈을 하면 된다. 일단 부호를 제외하고, 정수 부분은 2로 나누기를 연속으로 해서 2진수로 바꿔주자
101/2 = 50 ... 1
50/2 = 25 ... 0
25/2 = 12 ... 1
12/2 = 6 ... 0
6/2 = 3 ... 0
3/2 = 1 ... 1
정수 부분은 1100101 이다.
소수 부분은 0.625인데, 소수 부분은 2를 곱하기를 연속으로 해서 2진수로 바꿔주면 된다.
0.625 x 2 = 1.25 -> 1
0.25 x 2 = 0.5 -> 0
0.5 x 2 = 1.0 -> 1
이렇게 해서 소수 부분은 0.101 이다, 2진수로 표현을 해주면 -1100101.101(2)
이진수를 지표x가수 형태로 바꿔준다
소숫점을 앞쪽으로 옮겨서 맨 앞자리에 1만 남기도록 하는거다, 이렇게 하면 가수는 1100101101이 되고, 지수는 6이 된다
일단 부호와 기수를 먼저 채워넣자, 기수 부분에서 소수점 위에 있는 1은 제외하고 넣어준다 부호는 음수니까 1, 가수는 위에 구한 것을 앞에서 부터 넣고, 남아있는 비트는 0으로 채워준다.
지수에 바이어스를 더해준다 (2의 보수법을 하면 힘들다)
32비트(4바이트)의 경우 127, 64비트의 경우 1023를 더해준다
이렇게 되니까 두 수를 더해준다
이렇게 바이어스로 더해준 지수까지 넣어주면 완성이다
예제
#include <stdio.h>
#pragma warning(disable:4996)
#define MASK 1
int main(void)
{
float num;
unsigned int* pNum;
printf("실수를 입력하세요:");
scanf("%f", &num);
pNum = (unsigned int*)#
printf("\n16진수 표기 : 0x%X\n\n", *pNum);
printf("부호\t지수\t가수\n");
printf("%d\t", *pNum >> 31 & MASK);
for (int i = 30; i >= 23; i--)
{
printf("%d", *pNum >> i & MASK);
}
printf("\t");
for (int i = 22; i >= 0; i--)
{
if ((i + 1) % 4 == 0) printf(" ");
printf("%d", *pNum >> i & MASK);
}
printf("\n");
return 0;
}
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
외판원 순회 (TSP) 알고리즘 개념 (0) | 2025.04.02 |
---|---|
실수형 (float) 자료형의 메모리 구조, 실제로 변환해보기 (0) | 2025.03.23 |
[C++] 조합 (Combination) 구할 수 있는 알고리즘 (0) | 2025.03.12 |
[C++] multimap 값 가져오기 (0) | 2025.03.03 |
논 블로킹 알고리즘 (Non-blocking Algorithms) (1) | 2025.02.16 |