浮点数2.5的十六进制格式为0×40200000。。。。这个怎么转换过来的。。。。有点看不懂
ããæ°æ®ç±»åçä½ç¨æ¯è¯´ææ°æ®åæä½çæä¹ï¼æ¢å¥è¯è¯´ç»å®ä¸åå åï¼å¯ä»¥è¯´å®æ¯intç±»åï¼ä¹å¯ä»¥è¯´å®æ¯floatç±»åã
ããåæ¶Cè¯è¨ä¸è¾åºåå è¿å¶æ°ï¼å¿ é¡»æ¯æ´åæ°ï¼å æ¤ï¼å¯ä»¥ä½¿ç¨unionèåä½æ¥è¾åºæµ®ç¹æ°ç16è¿å¶ã示ä¾ä»£ç å¦ä¸ï¼
#include <stdio.h>union fi
{
float f;
int i;
} ufi;
int main()
{
ufi.f = 1.1f;
printf("%x\n", ufi.i );
}
ãã
需要准备的材料分别有:电脑、C语言。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。
2、在test.cpp文件中,输入C语言代码:printf("%x", 1515);。
3、编译器运行test.cpp文件,此时成功通过%x输出了十六进制的格式。
本回答被网友采纳然后要把10.1规格化(写成1.xxxx * 2^n的形式,有点像科学计数法)得到1.01*2^1(其中2^1中的1为阶码, 1.01为有效数字)
加上2.5为正数,这就得到三部分信息:
1. 有效数字为1.01.
2. 阶码为1.
3. 符点数为正数
而c/c++的float类型结构为:
1. 最低的23位记录规格化小数中的有效数字(但是不保存最前面的1)
2. 之后的8位记录阶码(上面的阶码转换到这里要+127)
3. 最高的一位表示正负数(0为正数,1为负数)
最终得到的二进制数为:
高位 低位
0 10000000 01000000000000000000000
整理得:
0100 0000 0010 0000 0000 0000 0000 0000
转到16进制得:
40200000
注意:0 无穷大 在符点数里比较特殊另外处理(我也不太明白-_-!)追问
那里具体怎么得到那么长的二进制数的我还是没有看懂,8位记录阶码没明白。。。
那里具体怎么得到那么长的二进制数的我还是没有看懂,8位记录阶码没明白。。。
追答有效数字得到 1.01应该没有问题吧
那么1.01 = 1.010 = 1.0100 ... 小数部分后面可以加无数的0, 跟整数部分在前面加无数的0是一个道理。
如果是10进制的话 12345 = 1.2345 * 10^4 那么4就阶码, 1.2345是有效数字。
同理,2进制的 10.1 = 1.01 * 2^1 1为阶码 1.01为有效数字(更为特殊是整数部分只能为1, 因为为0的话,就不是有效数字了)
float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数
{
// char cByte[4];//方法一
// for (int i=0;i<num;i++)
// {
// cByte[i] = Byte[i];
// }
//
// float pfValue=*(float*)&cByte;
//return pfValue;
return *((float*)Byte);//方法二
}
long FloatTohex(float HEX)//浮点数到十六进制转换1
{
return *( long *)&HEX;
}
void FloatToByte(float floatNum,unsigned char* byteArry)////浮点数到十六进制转换2
{
char* pchar=(char*)&floatNum;
for(int i=0;i<sizeof(float);i++)
{
*byteArry=*pchar;
pchar++;
byteArry++;
}
}
void main()
{
unsigned char floatToHex[4];
unsigned char hexbyte[4]={0xcd,0xCC,0xCC,0x3D};//传输数据为3d cc cc cd
float Hdecimal=0.0;
float flh=0.4;
// int num=sizeof(hexbyte);
// printf("num= %d\n",num);
Hdecimal=Hex_To_Decimal(hexbyte,sizeof(hexbyte));//十六进制转换为浮点数
printf("\n 浮点数为:\n %f\n",Hdecimal);
整数部分:
0x2
小数部分:
0.5*16=8=0x8
结合起来:
0x2.8