본문 바로가기
프로그래밍/C

C ] float to hex / hex to float Converter

by eteo 2023. 4. 9.

 

 

 

2023.04.09 - [프로그래밍/C# (WinForms)] - C#, WinForms ] float to hex / hex to float Converter

 

C#, WinForms ] float to hex / hex to float Converter

필요에 의해서 만들었다. 내가 예전에 소개한 float to hex converter 사이트랑 달리 시스템 아키텍쳐에 따라 메모리에 저장된 대로 보여준다. 디자이너 부분을 먼저 살펴보면 Form은 사용자가 크기를

eteo.tistory.com

 

 

 

위 글에서 WinForms로 만든 float to hex / hex to float Converter를 C언어로 간단히 구현해 본 것. 예외처리나 옵션 없이 리틀엔디안으로 변환하는 기능만 넣었다.

 

 

#include <stdio.h>
#include <stdint.h>
#define _CRT_SECURE_NO_WARNINGS

#define SWAP_UINT16(x) ((uint16_t)((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8)))
#define SWAP_UINT32(x) ((uint32_t) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)))

int main()
{
    int option;
    float floatValue;
    uint32_t hexValue;

    printf("변환 옵션을 선택하세요\n");
    printf("1. float to hex\n");
    printf("2. hex to float\n");
    printf("선택 : _\b");
    scanf("%d", &option);

    switch (option)
    {
    case 1:
        printf("float 값을 입력하세요 : ");
        scanf("%f", &floatValue);
        printf("변환값 : 0x");
        uint8_t* p = (uint8_t*)&floatValue;
        for (int i = 0; i < sizeof(floatValue); i++)
        {
            printf("%02X", *p++);
        }
        break;
    case 2:
        printf("hex 값을 입력하세요 : ");
        scanf("%x", &hexValue);
        hexValue = SWAP_UINT32(hexValue);
        printf("변환값 : %f", *((float*)&hexValue));
        break;
    default:
        break;
    }

    return 0;
}

 

 

 

 

 

 

 

변환시 단순하게 아래처럼 하면 안되는 이유는

 

printf("변환값 : %08X", *(uint32_t *)&floatValue);
printf("변환값 : %f", *((float*)&hexValue));

 

예를들어 사용자가 float to hex 변환을 선택하고 2를 입력했으면 32비트 부동소수점 표현으로 0x40000000 인데, 시스템이 리틀 엔디안 방식이라 실제 메모리에는 floatValue 변수 주소에 0x00000040 이 저장이 됐다.

 

그걸 (uint32_t *)로 캐스팅해서 읽으면 역시 시스템이 리틀 엔디안이라 낮은 주소에 낮은 값이 있다고 생각해서 읽으니까 0x40000000 으로 읽게된다.

 

 

실제 내가 의도한 것처럼 메모리에 저장된 값을 읽으려면 uint8_t 포인터로 순서대로 읽거나 엔디안 변환 매크로함수를 쓰면 된다.

 

 

uint8_t* p = (uint8_t*)&floatValue;
for (int i = 0; i < sizeof(floatValue); i++)
{
    printf("%02X", *p++);
}

// ...
#define SWAP_UINT32(x) ((uint32_t) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)))
hexValue = SWAP_UINT32(hexValue);
printf("변환값 : %f", *((float*)&hexValue));