首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

int exponent = 150 - ((ival >> 23) & 0xff);高手指教了,了!1

2012-04-05 
int exponent 150 - ((ival 23) & 0xff)高手指教了,在线等了!!在线等!!!!!!!1//将32位浮点数fval转

int exponent = 150 - ((ival >> 23) & 0xff);高手指教了,在线等了!!在线等!!!!!!!1
//   将32位浮点数fval转换为32位整数并存储在ival中
//   小数部分将被裁剪掉
//
void   TruncToInt32   (int   &ival,   float   fval)
{
ival   =   *(int   *)&fval;  
//   提取尾数
//   注意实际的尾数前面还有一个被省略掉的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;
}

请问int   exponent   =   150   -   ((ival   > >   23)   &   0xff);
为什么要用150减去取出来的指数呢,直接取出来时不就是指数的移码了吗?再减去127不就是指数了吗?为什么要用150呢?

还有void   TruncToInt32   (int   &ival,   float   fval)
int   &ival这个的作用是什么,还有为什么设置这个形参.


[解决办法]
int exponent = 150 - ((ival > > 23) & 0xff);

写成
int exponent = 23 +(127 - ((ival > > 23) & 0xff));
是不是好认点呢?
注意指数是用偏移表示的, 指数为0时,实际的exponent编码成127
[解决办法]
先回答你最后一个问题吧 int &ival是一个引用,引用可以理解为绰号, 这样的话,你对引用的任何操作实际上即是对原来那个实际变量的操作. 你如张三绰号瘪三, 你说你揣了瘪三一脚, 其实就是揣了张三一脚.

为啥要用引用而不直接传值呢? 因为函数执行的机制是对传进来的参数, 会临时建立一个该参数的拷贝,函数只对该拷贝做修改,不会修改原来的参数. 使用引用或者地址即可避免这一问题
[解决办法]
其实只要你知道了这里的尾数在实现的时候是:
int mantissa = (ival & 0x07fffff) | 0x800000;
也就是24位的话, 应该后面的理解就没有问题了

刚才打了半天字没有发出来, 不打了,而且这么少的分.....

给你改了改代码, 你自己测试几个数后就清楚了:

我把127和23分开写的,你就应该知道为啥要把那个尾数移位23了这样好认

#include <stdio.h>
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval;
printf( "Float:\t\t%08X(hex)\n ",ival);
// 提取尾数
// 注意实际的尾数前面还有一个被省略掉的1
int mantissa = (ival & 0x07fffff) | 0x800000;
printf( "mantissa:\t%08X(hex)\n ",mantissa);
// 提取指数
// 以23分界,指数大于23则左移,否则右移
// 由于指数用偏移表示,所以23+127=150
int exponent = 127 - ((ival > > 23) & 0xff);
printf( "EXP:\t\t%08X(hex), %d(dec)\n ",exponent,exponent);
exponent = exponent + 23;
printf( "exp:\t\t%08X(hex), %d(dec)\n ",exponent,exponent);
if (exponent < 0)
ival = (mantissa < < -exponent);
else
ival = (mantissa > > exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
void main()
{
float a=4.0; // 自己多试几个
int k;
TruncToInt32(k, a);
printf( "Integer:\t%08X(hex)\n ", k);

}

热点排行