最近我遇到了一段使用铸造方式的代码,我觉得很奇怪.这里也是例子:
inline float asfloat(unsigned int x){
return *(float *) &x;
}
inline float asfloat(int x){
return *(float *) &x;
}
Run Code Online (Sandbox Code Playgroud)
这种方式有什么优势吗?以下"更简单"的代码不会这样做吗?
inline float asfloat(unsigned int x){
return (float)x;
}
inline float asfloat(int x){
return (float)x;
}
Run Code Online (Sandbox Code Playgroud)
小智 9
前者执行一个按位演员,这是邪恶的(几乎像我一样邪恶).它接受整数的地址并取消引用它,就好像它是浮点数的地址一样.这也违反了别名规则,因此是未定义的行为.
后者将整数转换为保留信息的浮点数:
(float)42 == 42.0 // approximately, due to floating point precision errors
Run Code Online (Sandbox Code Playgroud)
我写了一个例子,证明两者不相等.
归档时间: |
|
查看次数: |
93 次 |
最近记录: |