读书人

ival = *(int *)amp;fval;高手解释了

发布时间: 2012-03-04 11:13:33 作者: rapoo

ival = *(int *)&fval;高手解释了,在线等!!!在线等!!!
// 将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;
}


[解决办法]
高手回答了
[解决办法]
ival = *(int *)&fval; ----这一句,是取浮点数的地址,把浮点数地址转换成指向整型的指针,再取指针中的值。这样不也是强制转换,不和直接把浮点型用C的强制转换成整型是一样的吗?这个转换不就是用C的强制转换完成的吗?那这样怎么提高转换性能?请教了!!!!!!!!!!!!
=============
这个转换,其实没有 转换 数据格式,
只是转换了数据类型 ~
它是把 fval 数据内容按照 int 格式进行解析,(数据类型转化了)
但是没有把这个里面的数据格式按照 int 标准进行转化 ~

ival = (int )fval; 这样的转化 转化了数据格式,也转化了数据类型
[解决办法]
按照整型的方式进行读取,起到什么作用呢,取出来的不还是那一串数吗?把它存到整型里面,整型在内存中存放,不还是那样的一串数吗?为什么不直接就用浮点型进行操作呢。这样做有什么用?高手指教了
[解决办法]
上面这段代码就是教你,如果不能够使用
整型 = (int)浮点型
进行类型转换的话,要如何实现这个功能。
差不多就是(int)强制类型转换浮点型为整型的源代码。

整型的1,和浮点型的1.0在内存中的数据是不一样的,所以这种直接按照整型解读浮点型数据的方法肯定和强制类型转换不同。
[解决办法]
应该仅仅是规定而已吧?

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

可能只是规定,或者也可能这样做float内部计算比较容易转换成机器码而已。

读书人网 >C语言

热点推荐