2016-01-14 80 views
1

假设我有一个工会的定义为:使用union将double转换为int?

typedef union{ 
    double d; 
    int i; 
} dtoi; 

如果我想要一个双转换为int,我有以下功能:

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

后来我还有一个功能转换它回到双倍:

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

这项工作?现在我想我得到一个错误的价值双倍。我想我不太了解如何在功能和模块之间实现联合和传递联合作为参数。

+0

你试过了return(int)dToI.d吗? –

回答

2

不,这不起作用。一方面,int通常是32位,而double通常是64.另一方面,浮点值基本上被分割成位字段,其中有很多位保存尾数,很多位保存指数,一位保存符号。另一方面,整数只是数字的基数2表示。他们的位不一样。

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

3

这项工作?

不,这不行。

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

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

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

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

你并不需要一个函数来的int转换为double。编译器会自动为你做到这一点。如果你必须有一个功能,这是微不足道的。

double intToDouble(int in) { 
    return in; 
} 
+1

但是当我将它转换成双倍数时,我会在小数点后丢失数字 – ballballbobo

+0

@ballballbobo,正如医生所说,“如果这样做会伤害,那就不要这么做。”只需保留'double',并在只需要整数部分时将其转换为'int'。 –