单精度浮点数按存储格式转为整数的程序

2024-09-08 08:08

本文主要是介绍单精度浮点数按存储格式转为整数的程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

///
#include<cstdio>//-----------------
union int_char
{unsigned char ch[4];float i;
};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。
{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右,从高位到低位依次为 0x:\n");printf("%X ",x.ch[3]);//最高位printf("%X ",x.ch[2]);printf("%X ",x.ch[1]);printf("%X \n\n",x.ch[0]);//最低位}//----------------int main(int argc, char* argv[])
{union int_char x;//x.i=123.456;//x.i=1.0;x.i=3.0;out_put(x);system("pause");return 0;
}

单精度浮点数

1.IEEE 754 标准所定义的单精度浮点数的长度为 32 位,按位域可划分为:符号位、阶码位与尾数位,如下:

  31----------------------22---------------------------------------------------------0|                       |                                                          |X X X X    X X X X    X X X X    X X X X    X X X X    X X X X    X X X X    X X X X| |-------------------| |----------------------------------------------------------|
符号        阶码                                     尾数

符号位取 0 表示正数,取 1 表示负数。

阶码位是 8 位,这里有一点小门道需要注意,那就是$2^n$的指数 n 并不能直接当作阶码来处理,需要将其与 127 (0x7f) 相加才可得到 $2^n$ 的阶码表示。

尾数的位域长度在图示中是 23 位,但实际上却是 24 位,这个位是“不可见”的,其值固定为 1,这也就是说 IEEE 754 标准所定义的浮点数,其有效数字是介于 1 与 2 之间的小数。

可以尝试写一下 1.0 这个数的二进制单精度浮点格式,这有助于更好地理解单精度浮点数格式的位域分布。

1.0 的二进制单精度浮点格式:0 0111 1111 000 0000 0000 0000 0000 0000

值得注意的一个问题是:书上说之所以要将指数加上 127 来得到阶码,是为了简化浮点数的比较运算,这一点我没有体会出来。但是通过 127 这个偏移量 (移码),可以区分出指数的正负。阶码为 127 时表示指数为 0;阶码小于 127 时表示负指数;阶码大于 127 时表示正指数。


2.首先将十进制数123.456转换为二进制数为:1111011. 01110100101111001 

      (其中0.456如何转换为二进制?不断乘2取整,顺序排列

       如:0.734375转二进制,结果是101111。

          0.734375 x 2 = 1.46875 
          0.46875 x 2 = 0.9375 
          0.9375 x 2 = 1.875 
          0.875 x 2 = 1.75 
          0.75 x 2 = 1.5 
          0.5 x 2 = 1.0) 

 

      1111011. 01110100101111001 即1. 11101101110100101111001乘以2的6次方

      首先这是一个正数,则符号位为0

      阶码为6,不过要转换成移码。

      (如何求6的移码?这里我也不太深究,我见大家都是直接6+127=133,换为2进制为10000101)

      (移码与补码的关系: [X]移与[X]补的关系是符号位互为相反数(仅符号位不同))

      尾数则为1. 11101101110100101111001的小数部分,即

11101101110100101111001

综上:123.456的二进制存储格式为:01000010111101101110100101111001


代码运行结果如下:

浮点数:1.0   (0 0111 1111 000 0000 0000 0000 0000 0000)

从高位到低位依次是:单精度浮点数值为:1.000000
存储位置从左到右,从高位到低位依次为 0x:
3F 80 0 0

=======================

浮点数:123.456  (01000010111101101110100101111001)

单精度浮点数值为:123.456001
存储位置从左到右,从高位到低位依次为 0x:
42 F6 E9 79


请按任意键继续. . .



用下面的代码也可以实现:


    float i=3.0;unsigned char* p=(unsigned char *)&i;printf("单精度浮点数值为:%f\n",i);printf("存储位置从左到右,从高位到低位依次为 0x:\n");printf("%X ",*(p+3));printf("%X ",*(p+2));printf("%X ",*(p+1));printf("%X \n\n",*p);


得到的结果是相同的。




这篇关于单精度浮点数按存储格式转为整数的程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147572

相关文章

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A