float*与int*互转会导致数据不正确,为什么C/C++还允许这么转?有其他什么用途吗?
怪我咯
怪我咯 2017-04-17 11:19:13
[C++讨论组]

float* 与 int* 互转会导致数据不正确,为什么C/C++还允许这么转?有其他什么用途吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
PHP中文网

我来举一个最经典的例子吧!http://zh.wikipedia.org/zh/%E5%B9%B3%E6%96%B9%E6%A0%B9%E5%80%92%E6%95%B0%E9%80%9F%E7%AE%97%E6%B3%95

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking(对浮点数的邪恶位级hack)
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck?(这他妈的是怎么回事?)
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration (第一次牛顿迭代)
//      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed(第二次迭代,可以删除)

    return y;
}

反正你可以这么做,于是你就可以作出很多超乎想想的事情~

这里通过过吧float*转成long*,将原浮点数的二进制表示直接与某个数相减来实现一个平方根倒数的估计。

PHP中文网

C 允许把你任意类型的指针转成另外的类型,至于得到的数据有没有用那是程序员的事。

就算你规定 float* 不能转成 int*,任何指针必然能和 void* 互转。你的限制有意义么?

一个东西存在不一定非要有用途,也可以是因为功能完整性的原因。底层应该提供机制,而非策略

伊谢尔伦

很多C语言的库都是通过将struct object指针转为void来实现容器的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号