使用union将double转换为int?

时间:2016-01-14 17:52:58

标签: c unions

假设我有一个定义为:

的联合
typedef union{
    double d;
    int i;
} dtoi;

如果我想将double转换为int,并且我有以下函数:

int doubleToInt(double d){
    dtoi dToI;
    dToI.d = d;
    return dToI.i;
}

后来我又有另一个函数将它转换回double:

double intToDouble(dtoi dToI){
    return dToI.d;
}

这会有用吗?现在我觉得我得到了错误的双倍价值。我想我并不完全理解联合和传递union作为函数和模块的参数是如何工作的。

2 个答案:

答案 0 :(得分:4)

没有。这不行。首先,int通常是32位,double通常是64.另一方面,浮点值基本上被分成位字段,有很多位保持尾数,所以很多持有指数,一个拿着标志。另一方面,整数只是数字的base-2表示。他们的位不是一样的。

要将双'd'正确转换为int,请尝试int i = (int)d;,反之:double d = (double)i;。这些实际上将值从一种格式转换为另一种格式。联盟只是重新解释现有的比特。

答案 1 :(得分:3)

  

这会有用吗?

不,这不起作用。

当您使用union时,设置一个成员并提取其他成员是未定义的行为。

当您设置int成员时,您应该只提取int成员。

您可以在不使用doubleToInt的情况下实施union

int doubleToInt(double d){
    return (int)d;
}

您不需要将int转换为double的功能。编译器会自动为您执行此操作。如果你必须有一个功能,这是微不足道的。

double intToDouble(int in) {
   return in;
}