为什么这个只打印0?

时间:2014-02-05 01:32:06

标签: c hex unions

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;
}

结果取决于平台!

3 个答案:

答案 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
  • 第三,如此键盘http://codepad.org/JSSJEKOn所示,您的代码是正确的,显然必须打印预期的结果。所以我认为错误不是在这里,而是源文件中的其他地方。请提供更多信息