C新手,我一直在尝试使用此代码转换十六进制输入。输入argv [1]我给它的是0xabcd123。它只给了我0输出。我也尝试过使用atoi以及改变输出类型。为什么它只打印0?这是代码,谢谢
#include <stdio.h>
#include <stdlib.h>
typedef union{
double num;
float f;
} U;
int main(int argc, char*argv[])
{
U u;
u.num = strtod(argv[1], NULL);
printf("%e\n", u.f);
return 0;
}
结果取决于平台!
答案 0 :(得分:2)
我认为由于字节顺序,它在一个系统上返回0。当您将值写为double但随后将其作为float读取时,您可能正在读取double的上半部分或下半部分,具体取决于体系结构。在一个系统上,它是double的空上半部分,另一个是下半部分,它包含值。
无论哪种方式,使用union,您都不应期望将任何值写为一种类型,并将其作为另一种类型读回并获得可靠的结果。正如你所发现的那样:)工会不是魔术类型的转换器,它们只是让你在一次知道有一种类型的值时节省空间。
答案 1 :(得分:-1)
num
被声明为int
。所以printf("%d", u.num)
或double num
答案 2 :(得分:-1)
u.num
的类型为double
,因此请使用%f
或%lf
代替%d