读书人

int exponent = 150 - ((ival gt;gt; 23)

发布时间: 2012-04-05 12:42:40 作者: rapoo

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);

}

读书人网 >C语言

热点推荐