通过解引用在C中强制转换变量
Casting variables in C via dereferencing
最近我遇到一段代码,它使用了一种我觉得很奇怪的类型转换方式。下面是两个例子:
inline float asfloat(unsigned int x){
return *(float *) &x;
}
inline float asfloat(int x){
return *(float *) &x;
}
这种方式有什么优点吗?下面"简单得多"的代码不也能做到这一点吗?
inline float asfloat(unsigned int x){
return (float)x;
}
inline float asfloat(int x){
return (float)x;
}
前者执行位强制转换,这是邪恶(几乎和我一样邪恶)。它接受整型的地址,并将其解引用,就像它是浮点数的地址一样。这也违反了混叠规则,因此是未定义行为。
后者将整型转换为浮点数,保留信息:
(float)42 == 42.0 // approximately, due to floating point precision errors
我写了一个例子来说明这两个是不相等的
它们的作用非常不同。第一个例子将整数中提供的位模式("表示")解释为浮点数的位模式。第二个示例将整型的表示数("value")转换为具有最接近等价值的浮点数。
http://ideone.com/As73ZB#include <iostream>
inline float asfloatbits(int x){
return *(float *) &x;
}
inline float asfloatvalue(int x){
return (float)x;
}
int main()
{
int abc = 12341234;
std::cout << asfloatbits(abc) << std::endl;
std::cout << asfloatvalue(abc) << std::endl;
}
据我所知,第一个接受原始整数值,并将其视为浮点数并返回它。第二个函数接受整数,并将其转换为最接近的等效浮点值并返回。
相关文章:
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 变量定义到C++布尔值转换
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 如何使用C++将字符串中的字符转换为整数变量
- 有没有将变量名称转换为双指针的简短方法?
- 静态成员变量不会由 gettext 转换
- 如何在C++中将字节向量(std::vector<uint8_t>)转换为不同的uint32_t,uint16_t和uint8_t变量
- VS 2017告诉我我正在尝试转换变量,但我没有
- 游戏引擎:如何从结构:编码实践转换变量
- 派生类 C++ 中的向上转换变量
- C++ 为什么我不能在结构中使用或强制转换变量进行算术运算?
- 如何强制转换变量成员以将其作为函数的引用参数传递
- gsoap 和 qt 转换变量内存句柄
- visualc++在转换变量时使用不同的基本类型
- 通过解引用在C中强制转换变量
- c++ -强制类型转换变量以及如何处理它们
- 转换变量类型(或变通方法)
- 为什么转换变量函数参数很重要?
- 在 Unicode 中转换变量
- 带有std::线程强制转换变量的c++多线程服务器