当前位置: 首页 > news >正文

【浮点数转16进制】小数(单精度浮点数)转16进制字节

#include <stdio.h>

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);
 long hX=FloatTohex(Hdecimal);//浮点数转换为十六进制一

 printf("\n正序十六进制值:\n %f=%X \n",Hdecimal,hX);//正序显示

 FloatToByte(Hdecimal,floatToHex);//浮点数转为十六进制二
    printf("\n倒序十六进制:\n%f=%x %x %x %x\n",Hdecimal,floatToHex[0],floatToHex[1],floatToHex[2],floatToHex[3] );//倒序显示
 FloatToByte(flh,floatToHex);//浮点数转为十六进制二

    printf("\n倒序十六进制:\n%f=%x %x %x %x\n",flh,floatToHex[0],floatToHex[1],floatToHex[2],floatToHex[3] );//低位在前

 FloatToByte(flh,floatToHex);//浮点数转为十六进制二
    printf("\n正序十六进制:\n%f=%x %x %x %x\n",flh,floatToHex[3],floatToHex[2],floatToHex[1],floatToHex[0] );//高位在前
}

原文:http://wenku.baidu.com/view/f3d376a4b0717fd5360cdc36.html

float存储格式及FPU:

float存储格式及FPU  

浮点数用科学计数法的形式存储, 即分成符号位, 底数位和指数位如 10.0 的二进制表示为 1010.0, 科学表示法表示为: 1.01exp110, 即 (1+0*1/2+1*1/4)*2^3. 小数点每左移一位指数要加1, 每右移一位指数要减1.

其存储格式符合IEEE标准, 即

数据格式        符号位     底数位     指数位


单精度 float     1        23          8


双精度 double    1        52         11


扩展精度         1        64         15

存储顺序为: 符号位 指数位 底数位, 由于底数的个位必为1, 因此个位和小数点就不存储. 指数位的高位也是符号位, 不过为1表示正, 0表示负.

float 因有 8 bits, 所以能表示的有 2 的 256 次方,
      但因為指數應可正可負,
      所以 IEEE 規定, 此處算出的次方須減去 127 才是真的指數,
      所以 float 的指數可從-126 到 128.
      double 型態有 11 bits, 算出的值須減去 1023,
      所以double 的指數可從 -1022 到 1024.
      底数   (mantissa):      
    〈特例〉0   不能以 2 的次方表示
      float : 00 00 00 00
      double: 00 00 00 00 00 00 00 00

由此可推断浮点数的精度. 单精度的底数只存储23位, 即最小一位为 1/2^23, 故精度为 1/2^23 = 1.19209e-7, 可精确到小数点后6位; 双精度的底数存储52位, 最小位为 1/2^52, 精度为 1/2^52 = 2.22045e-16, 能精确到小数点后15位.

双精度的最大值约为 2*2^(2^10-1), 约为1.79e308


关于FPU:
(gdb) list 1,80
1        #include <stdio.h>
2        int main(int argc,char **argv)
3        {
4        float val = 1000;
5        int   ival = val;
6        printf("%f\n",val);
7        printf("%d\n",ival);
8        }
(gdb) display/i $pc
(gdb) break main
Breakpoint 1 at 0x8048365: file float.c, line 4.
(gdb) r
Starting program: /home/lsm1982/float

Breakpoint 1, main () at float.c:4
4        float val = 1000;
1: x/i $pc   0x8048365 <main+17>:         mov     $0x447a0000,�x
(gdb) si
0x0804836a       4        float val = 1000;
1: x/i $pc   0x804836a <main+22>:         mov     �x,0xfffffff4(�p)
(gdb)
5        int   ival = val;
1: x/i $pc   0x804836d <main+25>:         flds    0xfffffff4(�p)
(gdb)
0x08048370       5        int   ival = val;
1: x/i $pc   0x8048370 <main+28>:         fnstcw 0xffffffea(�p)
(gdb)
0x08048373       5        int   ival = val;
1: x/i $pc   0x8048373 <main+31>:         movzwl 0xffffffea(�p),�x
(gdb)
0x08048377       5        int   ival = val;
1: x/i $pc   0x8048377 <main+35>:         mov     $0xc,%ah
(gdb)
0x08048379       5        int   ival = val;
1: x/i $pc   0x8048379 <main+37>:         mov     %ax,0xffffffe8(�p)
(gdb)
0x0804837d       5        int   ival = val;
1: x/i $pc   0x804837d <main+41>:         fldcw   0xffffffe8(�p)
(gdb)
0x08048380       5        int   ival = val;
1: x/i $pc   0x8048380 <main+44>:         fistpl 0xfffffff8(�p)
(gdb)
0x08048383       5        int   ival = val;
1: x/i $pc  

相关文章:

  • 【VISIO绘图】VISIO绘图 学习笔记
  • 【FLASH 操作】FLASH 读写等操作 学习
  • 【ARM9】ARM 2440 学习笔记
  • 【学习经验】学习经验总结
  • 【C到C++】C到C++ 学习笔记 【概念】
  • 【IAR外部编辑器】IAR 使用外部编辑器(VS2005/2008/2010等)的设置
  • 【捕获比较模式】msp430定时器比较捕获理解
  • 【C/C++】C语言signal信号|软中断信号|程序捕获Ctrl+C 信号
  • 【setjmp和longjmp 】 C语言的非局部跳转:setjmp和longjmp(跨函数长跳转)
  • 【C到C++】关于 Complex (复数类)
  • 【C到C++】C++中的抛出异常throw 和异常处理try- catch
  • 【托管引用】C++/CLI中的引用类型
  • 【C到C++】简单数据库
  • 【ATL CLR MFC Win32 】ATL CLR MFC Win32 常规 的区别
  • 【VC++ MFC】OnDraw()和OnPaint()
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 3.7、@ResponseBody 和 @RestController
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JAVA_NIO系列——Channel和Buffer详解
  • Java多态
  • java中的hashCode
  • miaov-React 最佳入门
  • npx命令介绍
  • Python 基础起步 (十) 什么叫函数?
  • Spring Boot快速入门(一):Hello Spring Boot
  • uva 10370 Above Average
  • vue--为什么data属性必须是一个函数
  • vue自定义指令实现v-tap插件
  • webpack4 一点通
  • Zepto.js源码学习之二
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于webpack 的 vue 多页架构
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 深度学习中的信息论知识详解
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用putty远程连接linux
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​力扣解法汇总946-验证栈序列
  • ​一些不规范的GTID使用场景
  • #1014 : Trie树
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (145)光线追踪距离场柔和阴影
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • .naturalWidth 和naturalHeight属性,
  • .Net 4.0并行库实用性演练
  • .Net CF下精确的计时器
  • .Net 代码性能 - (1)
  • .skip() 和 .only() 的使用
  • []指针