2023.04.09 - [프로그래밍/C# (WinForms)] - C#, WinForms ] float to hex / hex to float Converter
위 글에서 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));
'프로그래밍 > C' 카테고리의 다른 글
C언어 ] setjmp(), longjmp() (0) | 2023.05.07 |
---|---|
C언어 ] 맵 자료구조 구현 (0) | 2023.05.07 |
C ] 시간복잡도가 O(1)인 2의 거듭제곱 판별 (0) | 2023.03.31 |
C ] atoi 함수 구현 (0) | 2023.03.25 |
C ] isalpha, isupper, islower, isdigit, isxdigit, isalnum, isspace, ispunct, isprint, isgraph, iscntrl, isascii, 함수 구현 (0) | 2023.03.25 |