使用 union 将 double 转换为 int?

convert a double to int using union?

假设我有一个联合定义为:

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 和将 union 作为参数跨函数和模块传递是如何工作的。

Would this work?

不,这行不通。

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

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

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

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

您不需要将 int 转换为 double 的函数。编译器会自动为你做这件事。如果你必须有一个功能,那是微不足道的。

double intToDouble(int in) {
   return in;
}

没有。这是行不通的。一方面,int 通常是 32 位,double 通常是 64 位。另一方面,floating-point 值基本上被分成位域,有很多位持有尾数,有很多持有尾数指数,和一个持有标志的人。另一方面,整数只是数字的 base-2 表示。他们的位只是排列不一样。

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