ival = *(int *)&fval;高手解释了,在线等!!!在线等!!!

unbutun 2007-04-02 08:13:51
// 将32位浮点数fval转换为32位整数并存储在ival中
// 小数部分将被裁剪掉
//
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval; ----这一句,是取浮点数的地址,把浮点数地址转换成指向整型的指针,再取指针中的值。这样不也是强制转换,不和直接把浮点型用C的强制转换成整型是一样的吗?这个转换不就是用C的强制转换完成的吗?那这样怎么提高转换性能?请教了!!!!!!!!!!!!
// 提取尾数
// 注意实际的尾数前面还有一个被省略掉的1
int mantissa = (ival & 0x07fffff) | 0x800000;
// 提取指数
// 以23分界,指数大于23则左移,否则右移
// 由于指数用偏移表示,所以23+127=150
int exponent = 150 - ((ival >> 23) & 0xff);
if (exponent < 0)
ival = (mantissa << -exponent);
else
ival = (mantissa >> exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
...全文
482 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
unbutun 2007-04-05
  • 打赏
  • 举报
回复
高手指教,为什么要以23分界,指教了!!!
w_anthony 2007-04-05
  • 打赏
  • 举报
回复
应该仅仅是规定而已吧?

实在想不出设计float结构的人为什么要对指数作偏移,2的127次方是10的38次级数的,而2的-128次方则是10的-39次方级数的,完全与float范围10E-38~10E38吻合了。

可能只是规定,或者也可能这样做float内部计算比较容易转换成机器码而已。
unbutun 2007-04-05
  • 打赏
  • 举报
回复
为什么要以23分界?
高手指教!!!!!!
unbutun 2007-04-04
  • 打赏
  • 举报
回复
int exponent = 150 - ((ival >> 23) & 0xff);
为什么提取出指数还要用150减去呢?
netxuning 2007-04-03
  • 打赏
  • 举报
回复
关注……
lin_programmer 2007-04-02
  • 打赏
  • 举报
回复
double d = 1.0;
d&0x0;
试一下这个能不能通过
lin_programmer 2007-04-02
  • 打赏
  • 举报
回复
你试一下编译能不能通过就知道了
green__hand 2007-04-02
  • 打赏
  • 举报
回复
请问浮点型为什么不好做逻辑操作,为什么不能提取指数、尾数呢?
不是一样的在内存中是二进制存放的吗,直接按位与,或就好了。为什么不能呢?
指教了!!!!!!
freshui 2007-04-02
  • 打赏
  • 举报
回复
整形1 是0x00000001
浮点的1是 0x03FF80000
好像这样,记得不太清了
lin_programmer 2007-04-02
  • 打赏
  • 举报
回复
浮点型不好做逻辑操作,不能提取指数、尾数数值
cqpp 2007-04-02
  • 打赏
  • 举报
回复
自己试一下不就知道了有什么不同。
unbutun 2007-04-02
  • 打赏
  • 举报
回复
实际的尾数前面还有一个被省略掉的1---是怎么回事,浮点数不就是23尾数,前面的1是怎么回事?23位前面不就是指数部分了吗?这个1是干什么?
w_anthony 2007-04-02
  • 打赏
  • 举报
回复
上面这段代码就是教你,如果不能够使用
整型 = (int)浮点型
进行类型转换的话,要如何实现这个功能。
差不多就是(int)强制类型转换浮点型为整型的源代码。

整型的1,和浮点型的1.0在内存中的数据是不一样的,所以这种直接按照整型解读浮点型数据的方法肯定和强制类型转换不同。
green__hand 2007-04-02
  • 打赏
  • 举报
回复
按照整型的方式进行读取,起到什么作用呢,取出来的不还是那一串数吗?把它存到整型里面,整型在内存中存放,不还是那样的一串数吗?为什么不直接就用浮点型进行操作呢。这样做有什么用?高手指教了
jixingzhong 2007-04-02
  • 打赏
  • 举报
回复
ival = *(int *)&fval; ----这一句,是取浮点数的地址,把浮点数地址转换成指向整型的指针,再取指针中的值。这样不也是强制转换,不和直接把浮点型用C的强制转换成整型是一样的吗?这个转换不就是用C的强制转换完成的吗?那这样怎么提高转换性能?请教了!!!!!!!!!!!!
=============
这个转换,其实没有 转换 数据格式,
只是转换了数据类型 ~
它是把 fval 数据内容按照 int 格式进行解析,(数据类型转化了)
但是没有把这个里面的数据格式按照 int 标准进行转化 ~

ival = (int )fval; 这样的转化 转化了数据格式,也转化了数据类型
green__hand 2007-04-02
  • 打赏
  • 举报
回复
高手回答了
vc_asm 2007-04-02
  • 打赏
  • 举报
回复
QQ:46544151 ,注明 ival = *(int *)&fval;高手解释了
softwarewander 2007-04-02
  • 打赏
  • 举报
回复
关注……

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧