使用 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;
。这些实际上将值从一种格式转换为另一种格式。联合只是重新解释现有位。
假设我有一个联合定义为:
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;
。这些实际上将值从一种格式转换为另一种格式。联合只是重新解释现有位。