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

原始二进制怎么转换成对应的浮点数

2012-09-08 
原始二进制如何转换成对应的浮点数原始二进制如何转换成对应的浮点数:如0B14 6344 A516这6个字节的数据能

原始二进制如何转换成对应的浮点数
原始二进制如何转换成对应的浮点数:如0B14 6344 A516这6个字节的数据能转换成如下4个浮点数吗:8.5 0.6 10.1 7.0

[解决办法]
分单精度和双精度以及扩展精度,如果是单精度的话,有32位构成,其中第一位是正负位,然后接下来7位是指数位E,后23位是底数位M
浮点数即 (-1)a[0]*(1+(M)*2(-23))(E-127),这是当E不全为0时,全为0的话,则底数不必加上1计算,如果E全是1,则该数为NAN(Not a number)
[解决办法]

C/C++ code
#include <stdio.h> #include <math.h> int main(void) { char binaryNum[100]; /** * You can not represent a binary number directly in C. * so i use a character array to store it. See...Anyway * we just focus on the result, no matter what method * is considered. :-) */ char *p = binaryNum; double decimalNum = 0; int n = 0, dotsNum = 0, i = 0, j = 0; printf("Please type in a binary number:\n"); scanf("%s", &binaryNum); /** * CHECK IF THE ENTERED BINARY NUMBER IS LEGAL. * I USED POINTERS. I TREAT THIS DECIMAL AS TWO * PARTS: INTEGER & DECIMAL. */ for ( ; *p != '\0'; p++, n++) { if (! (*p == '0' || *p == '1' || *p == '.')) { printf("bad input!\n"); return 1; } if (*p == '.') { dotsNum++; if (dotsNum == 1) i = n; else { printf("bad binary number!\n"); return 1; } } } if (dotsNum) j = n -1 - i; else i = n; p = binaryNum; for ( ; i > 0; p++, i--) if (*p == '1') decimalNum += pow(2, i -1); for (p++, i = 1; i <= j; p++, i++) if (*p == '1') decimalNum += pow(2, -i); printf("The converted decimal number is:\n"); printf("%f\n", decimalNum); return 0;}
[解决办法]
是不是想:
C/C++ code
#include "stdafx.h"void main(){    unsigned char bytes[] = {0x63, 0x78, 0xa9, 0x2e, 0x95, 0xcf};    unsigned short *p = (unsigned short *)bytes;    float floats[3];    floats[0] = (float)p[0];    floats[1] = (float)p[1];    floats[2] = (float)p[2];}
[解决办法]
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。

任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:

````````符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
临时数 1 15 64 80

由于通常C编译器默认浮点数是double型的,下面以double为例:
共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
最高位63位是符号位,1表示该数为负,0正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。
[解决办法]
>>11楼的,你遇到的自定义浮点数是什么情况?能把当时的解决办法说一下吗?或者提供一些资料什么的,谢谢啦,

遇到的是3个字节表示浮点数的
然后数据定义是在一个通讯协议里,协议已经很老了,但是还是有说明这3个字节的占位。
最后就是对数据拿来后进行转换,写个转换函数就能匹配到正常的IEEE754标准了!

热点排行