我正在尝试编写一个算法,将十六进制数转换为浮点数或将浮点数转换为十六进制数。这是一个作业的一部分,程序应该接收以“0x”开头的8位十六进制数或浮点数,并使用计算机的“内置IEEE 754功能”将数字转换为十六进制或浮点数。代码应该用C语言编写。
我的方法如下。将用户输入存储为字符串。将输入字符数组传递给一个方法,检查它是否为十六进制数,通过检查数组的前两个位置,这些位置应为0和X(假定所有十六进制数都是以此方式传递的)。如果是这种情况,则检查十六进制数的格式是否正确,即不要有过多的数字或数字超出了0-15范围(还考虑了ABCDEF约定)。
因此,我的问题是,我不知道如何将此数组转换回可以用来转换为浮点数的数字。我考虑使用sscanf将其转换回浮点数,但我不太熟悉C,也没有在网上找到任何好的资料。
能否有人指点我正确的方向?我还考虑同时将用户输入存储为字符串和数字,但我不确定是否可能。
这里是两个形式检查函数和不完整的主方法:
我的方法如下。将用户输入存储为字符串。将输入字符数组传递给一个方法,检查它是否为十六进制数,通过检查数组的前两个位置,这些位置应为0和X(假定所有十六进制数都是以此方式传递的)。如果是这种情况,则检查十六进制数的格式是否正确,即不要有过多的数字或数字超出了0-15范围(还考虑了ABCDEF约定)。
因此,我的问题是,我不知道如何将此数组转换回可以用来转换为浮点数的数字。我考虑使用sscanf将其转换回浮点数,但我不太熟悉C,也没有在网上找到任何好的资料。
能否有人指点我正确的方向?我还考虑同时将用户输入存储为字符串和数字,但我不确定是否可能。
这里是两个形式检查函数和不完整的主方法:
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);
unsigned char i = 10; printf("%x", i);
将会输出a
。 - γηράσκω δ' αεί πολλά διδασκόμεf
是double
类型时,您需要执行printf("%lf", f);
。 - Florisdouble
时,l
是可选的,不是必需的。 - chux - Reinstate Monica