c语言问题,请教高手,在线等!!
// 将32位浮点数fval转换为32位整数并存储在ival中
// 小数部分将被裁剪掉
//
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval;--------这个是怎么回事?*(int *)&是什么东西?
// 提取尾数
// 注意实际的尾数前面还有一个被省略掉的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; //((int *)&fval ===> 将float型指针转换成int型指针
// *(int *)&fval ===> 再取地址赋给ival )
[解决办法]
正是因为浮点数与整数的存储格式不同,
所以*(int*)&fval实际上是把原来浮点数存储的数据以整数的格式读出来。
[解决办法]
void main()
{
float fval=1.0;
cout < <fval < < ' ' < <&fval < < ' ' < <(int*)&fval < < ' ' < < ' ' < <(*(int *)&fval) < <endl;
}
输出结果
1, 0012FF7C, 0012FF7C, 1065353216
中间两步地址都没变,就最后一步变了.
[解决办法]
请教,还有整型在内存中是怎么个存放形式,低8位,高8位各存放什么,谢谢。请教了!!!!!
--------------------
整型存放方式很简单,比如1000000这个数,十六进制就是0x000F4240,
内存中就是40 42 0F 00
[解决办法]
LZ真是个不喜欢断点跟踪调试的家伙么?
比如float fval = 1000000.5f;
那么他根据浮点数各位的定义概念,可以知道在内存中的数据是08 24 74 49
void TruncToInt32(int &ival, float fval)
{
ival = *(int *)&fval; //执行这部后,并未对08 24 74 49进行任何处理,只是将这四个字节的数据解释为整型,根据整型的存放规则,可以知道ival为0x49742408
int mantissa = (ival & 0x07fffff) | 0x800000; //mantissa为0x00F42408
int exponent = 150 - ((ival > > 23) & 0xff); //exponent为4
if (exponent < 0)
ival = (mantissa < < -exponent);
else
ival = (mantissa > > exponent); //0xF42400,也就是1000000
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
[解决办法]
w_anthony--------
LZ真是个不喜欢断点跟踪调试的家伙么?
比如float fval = 1000000.5f;
那么他根据浮点数各位的定义概念,可以知道在内存中的数据是08 24 74 49
void TruncToInt32(int &ival, float fval)
{
ival = *(int *)&fval; //执行这部后,并未对08 24 74 49进行任何处理,只是将这四个字节的数据解释为整型,根据整型的存放规则,可以知道ival为0x49742408
请问以上说的那个float型的,是怎么转换成08 24 74 49的,还有他把浮点数转换成整型的格式存在ival里和把他直接用float型进行计算有什么区别?float也是可以按位与、或的。为什么要转换成int型的呢?
指教了!!!!!!
[解决办法]
你自己上面也说了,浮点型在内存中,IEEE 浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。
至于具体的对应关系,你找本C的书籍就有详细说明。
1000000.5f在内存中的数据是08 24 74 49,我是通过printf打印出来看的。
float f;
f&0x10;
f> > 4;
你看通不通得过编译。
[解决办法]
这个还有一点印象,好像是下面这样定义的:
十进制的浮点数在内存里面必定是以0或1表示的,所以先将十进制转换为二进制浮点数,
所谓浮点也就是小数点是浮动的,因此在二进制浮点数中必然表示为1.xxxxx E yy(即小数点前只可能是1,不可能是0,因为如果是0,那么将会变动指数部分)。
这样就会发现既然任何一个浮点数小数点前都是1,那么还用一个位来保存它岂不是浪费资源?所以内存中小数点前面的1就被省略了。
而这段代码,人为解释float结构的话,自然要把这个省略的1加上。