1个回答
展开全部
这个问题你需要理解32位浮点数和整形数的二进制存储,32位浮点的二进制存储是1位符号为,8为指数位,23为尾数位,如何将一个浮点数转换成二进制呢比如12.5首先整数部分12的二进制计算用12/2的余数转换得到二进制1100,而小数部分0.5,用0.5*2后的整数部分进行计算得到.1000000,最后12.5的表示为1100.1000000000000000000000000,再将小数点左移动3位,
1.10010000000000000000000000000,计算指数,指数的基准是127,该数的指数应该是127+3
=130,二进制为10000010,由于12.5是整数则符号位为0,整个12.5的二进制表示为01000001010010000000000000000000,这就是32位浮点的二进制过程,那么我们把32位传换成8位就反向推这个过程。
先取出指数的8位,换算成数值,减去127,得到具体移动的小数点位数,然后将后面23位的小数点向右移动该位数,小数点左边部分就是整数部分。
这里面要用到几个关键操作<<左移,>>右移,|=位加,下面是我以前把一个40位浮点转换成64位浮点的情况,40的浮点的组织和32位一样,只是精度更高,就是位数编程了31位,希望对你又帮助
DOUBLE ParseTool::Change40BitTo64Bit(UINT nData,BYTE bData)
{
ULONGLONG lData = nData;
//把LONGLONG左移8位
lData <<=8;
UINT nTempData = bData;
//把一个BYTE加在LONGLONG的低位
lData |=bData;
ULONG* pLData = (ULONG*)&lData;
//把LONGLONG的高32位向左移一位
*(pLData+1) <<= 1;
//把LONGLONG的低32位向右移31位,剩下最高的一位
ULONG lTempData = (*pLData)>>(32-1);
//把LONGLONG的低32位的最高一位加在高32位的最后一位
*(pLData+1) |= lTempData;
//由于LONGLONG的高32位正好是指数位,把8位的指数位换算成11位
*(pLData+1) =*(pLData+1)+DOUBLE_EXPONENT_BASE-FLOAT_EXPONENT_BASE;
//把LONGLONG的高32向左移20为,正好放在存放DOUBLE的11位指数的位置
*(pLData+1)<<=20;
//把LONGLONG的低32为向右移动11位得到该32位中的高20位
lTempData =(*pLData)>>(32-21);
//把LONGLONG的低32位中的高20加到高32位中的低20位
*(pLData+1) |= lTempData;
//把LONGLONG的底32位左移动21位
(*pLData)<<=21;
lTempData = *(pLData+1);
DOUBLE dData =*((DOUBLE*)pLData);
return dData;
}
注意:你这个题目是有问题的,32位浮点数存储的范围远远大于8位整形,所以存在溢出情况,更不可能从8位反向转换到32位
1.10010000000000000000000000000,计算指数,指数的基准是127,该数的指数应该是127+3
=130,二进制为10000010,由于12.5是整数则符号位为0,整个12.5的二进制表示为01000001010010000000000000000000,这就是32位浮点的二进制过程,那么我们把32位传换成8位就反向推这个过程。
先取出指数的8位,换算成数值,减去127,得到具体移动的小数点位数,然后将后面23位的小数点向右移动该位数,小数点左边部分就是整数部分。
这里面要用到几个关键操作<<左移,>>右移,|=位加,下面是我以前把一个40位浮点转换成64位浮点的情况,40的浮点的组织和32位一样,只是精度更高,就是位数编程了31位,希望对你又帮助
DOUBLE ParseTool::Change40BitTo64Bit(UINT nData,BYTE bData)
{
ULONGLONG lData = nData;
//把LONGLONG左移8位
lData <<=8;
UINT nTempData = bData;
//把一个BYTE加在LONGLONG的低位
lData |=bData;
ULONG* pLData = (ULONG*)&lData;
//把LONGLONG的高32位向左移一位
*(pLData+1) <<= 1;
//把LONGLONG的低32位向右移31位,剩下最高的一位
ULONG lTempData = (*pLData)>>(32-1);
//把LONGLONG的低32位的最高一位加在高32位的最后一位
*(pLData+1) |= lTempData;
//由于LONGLONG的高32位正好是指数位,把8位的指数位换算成11位
*(pLData+1) =*(pLData+1)+DOUBLE_EXPONENT_BASE-FLOAT_EXPONENT_BASE;
//把LONGLONG的高32向左移20为,正好放在存放DOUBLE的11位指数的位置
*(pLData+1)<<=20;
//把LONGLONG的低32为向右移动11位得到该32位中的高20位
lTempData =(*pLData)>>(32-21);
//把LONGLONG的低32位中的高20加到高32位中的低20位
*(pLData+1) |= lTempData;
//把LONGLONG的底32位左移动21位
(*pLData)<<=21;
lTempData = *(pLData+1);
DOUBLE dData =*((DOUBLE*)pLData);
return dData;
}
注意:你这个题目是有问题的,32位浮点数存储的范围远远大于8位整形,所以存在溢出情况,更不可能从8位反向转换到32位
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询