将十六进制转换为浮点数,反之亦然

我正在尝试编写一个算法来将十六进制数转换为浮点数,反之亦然.这是一个赋值的一部分,该程序应该接收一个以’0x’或浮点数开头的8位十六进制数,并使用计算机的’内置IEEE 754功能’将数字转换为十六进制或浮点数.代码应该在C中.

我的方法如下.将用户的输入存储为字符串.将输入char数组传递给一个方法,该方法通过检查数组的前两个位置来检查它是否是十六进制数,该位置应为0和X(假设所有十六进制数都以这种方式传递).如果是这种情况,那么我检查十六进制是否是适当的形式,即在0-15范围之外没有太多的数字或数字(也考虑到ABCDEF惯例).

所以,我的问题是,我不知道如何将此数组转换回我可用于转换为浮点数的数字.我想过使用sscanf把它变回浮点但是我不太了解C并且没有找到任何好的在线资源

有人能指出我正确的方向吗?我还想过将用户输入同时存储为字符串和数字,但我不确定这是否可行.

这是两个表单检查函数和不完整的main方法:

int is_hex(char arr[])
{
    if (arr[0] == '0' && (arr[1] == 'x' || arr[1] == 'X')) {
        return 1;
    }
    return 0;
}

int check_if_good(char arr[])
{
    if (is_hex(arr)) {
        int len = strlen(arr);
        for (int i = 2; i < len; i++) {
            if ((arr[i] > 'f' && arr[i] <= 'z') || (arr[i] > 'F' && arr[i] <= 'Z')) {
                return 0;
            }
        }
    }

    return 1;
}

int main(int argc, const char * argv[])
{
    float x;
    char input[30];
    scanf("%s", input);
    printf("%s", input);
    return 0;
}

如果有人也能告诉我’%x’的基本知识意味着我真的很感激它.根据我的理解,它允许我以十六进制形式收集数字,但我可以将它们存储在整数和浮点数中吗?非常感谢您的帮助.

– 编辑:floris的额外代码.我试图在不使用任何额外库的情况下解决此问题,因此您无法使用stdint lib.

char input[30];
scanf("%s", input);
if(check_if_good(input)){  //Ignore this if-statement.
    printf("Input is in hex form");
}
int num = convert_hex_string(input); // this function works perfectly. It return the int form of the hex.
double f = *((double*)&num);
printf("%f\n", f);
最佳答案
如果您确实想知道特定十六进制字符串表示的浮点数,可以将字符串转换为整数,然后查看假设包含浮点数的地址.这是如何工作的:

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

int main(void) {
  char myString[]="0x3f9d70a4";
  uint32_t num;
  float f;
  sscanf(myString, "%x", &num);  // assuming you checked input
  f = *((float*)&num);
  printf("the hexadecimal 0x%08x becomes %.3f as a float\n", num, f);
}

这产生了输出

the hexadecimal 0x3f9d70a4 becomes 1.230 as a float

正如所料.有关详细信息,请参见my answer to your other question about a related topic.

您还应该很容易看到如何反向执行上述操作 – 从浮点数开始,并获得十六进制表示.

转载注明原文:将十六进制转换为浮点数,反之亦然 - 代码日志