假设我有一个定义为:
的联合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作为函数和模块的参数是如何工作的。
答案 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;
}