分享好友 最新动态首页 最新动态分类 切换频道
类型强转和地址强转
2024-12-26 11:10

1 例子

     最近在干一个很复杂的事—读4w多行的项目源码,头都大了有木有!其中有一步是加载一个二进制文件,为了更好的理解代码的含义,我需要一点一点解析二进制文件。在解析到某个位置的时候,有个读浮点数的操作,对应的二进制值为:…CAF249F1…。非常好奇这个值对应的浮点数是多少,所以写代码去求解一下。这里我没有犯一个错误:原始的文件中是按照从低字节到高字节排序的,所以实际的数应该为:0xF149F2CA。但是还是犯了很多错误,最初的代码为

 

想法是通过隐式类型强转获得对应的浮点数,但输出结果为:a is 4048155338,b is 4048155392.000000,完全不是想象中的样子。隐式的类型强转只是将一个int型的数变成一个和原值接近的浮点数,而不是将原始的int值按照地址解析成浮点数。后来一想也对,要不这样强转还有什么意义。注意强转的结果并不和原值一样,这是由float类型的精度造成的,后面我们会详细介绍其中的原理。

     上述方法不行,我又想到利用字符串进行转换,代码如下

 

想法也很简单,将连续四个字节利用atof函数解析成浮点数,输出结果为:a is caf249f1,b is 0.000000,再一次不正确!后来仔细查看atof的解释才明白,原来atof函数只能解析符合浮点数书写格式的数,例如0.0314或者3.14E-2。如果字符串完全无法被转换为数字,则返回0。

     连续两次都没有解决,我怒了!想了一种操作地址的方式,代码如下

 

代码的思想是首先获得int型的地址,然后将该地址强转成float型地址,然后再获得float的值,这样应该不会错了,输出的结果为:a is 4048155338,b is -1000000015047466219876688855040.000000。这个结果可能不太直观,但是我知道这就是我想要的结果。b输出了一个很大的负数,如果将其转换成科学记数法则为-1E30,正好在代码中有个LOG_ZERO的宏定义为该值,正好对应起来了。该浮点数的含义是对某个变量赋初值,初值为log(0)的近似定义。

2 类型强转

符号阶码尾数

如果是单精度(float)类型,上述格式的符号部分为1位,阶码部分为8位,尾数部分为23位;如果是双精度(double)类型,符号部分为1位,阶码部分为11位,尾数部分为52位。

    根据阶码的不同,被编码的值可以分为三种情况(最后一种情况有两个变种)。此外,要注意下面的表是IEEE的浮点数表示,而不是原始浮点数的表示。

2. 非规格化的

非规格化数有两个用途。首先,它提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使>=1,因此我们就不能表示0。当阶码和尾数都为0时就表示0,不过符号位的不同会产生+0.0与-0.0。其次,非规格化可以表示非常接近于0.0的数。

在《深入理解计算机系统》P72有一个很详细的例子,建议大家仔细阅读。

    讲了这么多,我们现在应该明白为什么整数强转成浮点数之后会有精度损失。这是因为float在计算机表示中尾数(float的有效位)只有23位,而int整数有32位,这就导致在将int转换成float的时候,int的低位就会被truncate,最大可能会产生511的误差。

    当然并不是所有的强转都会导致精度损失,这也和整数值的有效位数相关,具体指的是前置1和后置1之间的部分。下面给出一个例子:

 

上述代码的输出为:a is 1048592, type cast of a  is 1048592.000000, b is 134217736, type castof b is 134217728.000000。可以看到a在强转的时候没有精度损失,但是b在强转时产生了精度损失。这是因为a的有效位数小于23位,在强转时float的尾数可以容纳;但是b的前置和后置1之间的位数为23位,这样在强转的时候最低位的1就会被truncate,从而结果产生了8的误差。

    上述误差的产生是由尾数位数过少造成的,针对float类型的阶码部分,我们能有什么收获呢?利用类型强转将int转成float之后,阶码部分就保存了这个整数的最高位次,因而我们可以用阶码来求整数的前置1位置,我会在后面的博客中详细介绍整数前置1的位置求法。

3 地址强转

    地址强转算是一项比较高级的操作,直接将原始地址的类型进行改变。语法也比较复杂,首先通过&符号获得原类型的地址,然后通过(type*)将地址类型进行强转,最好再利用*取值获得新类型的值。这种强转在大多数情况下都没有意义,但是一种情况例外,即在将float的地址强转成int地址时会有特殊意义。

最新文章
茂名爱采购运营价格
百度爱采购的服务:全网优质资源。接入全网优质网站,优质在线商家和商品遍布各个行业,覆盖各大类别。爱采购依托百度强大的搜索技术,服务大量用户,利用AI技术快速处理信息,匹配需求线索,准确到达买卖双方。该平台可直接到达全网商品信
浙江东方(600120)个股分析
[{"date":"2024-05-31","value":"182","field":"0"},{"date":"2024-06-03","value":"-1960","field":"0"},{"date":"2024-06-04&q
请问广告主想要投放广告是选小红书乘风平台还是小红书聚光平台呢?
2022年08月26日陈建贵100资深效果广告开户代运营公司,小红书、B站信息流广告,达人探店种草,抖音千川,腾讯视频号等广告开户代运营日用百货销售;化妆品批发;食品销售(仅销售预包装食品);化妆品零售;新鲜水果零售;互联网销售(除销售需
通信工程师:C网电信认证(题库版).docxVIP
通信工程师:C网电信认证(题库版)1、多选?基于RADIUS的远端接入环境一般由三个主要部件构成()。A.接入客户端B.网络接入服务器C.RADIUS服务器正确答案:A,B,C2、单选?投诉处理结果通过工单接(江南博哥)口进行传递,工单接口的形式为:
最强AI美女写真生成工具评测:用搜狐简单AI创造你的数字女友!
在这个充满科技和创造力的时代,美女写真不再是摄影师的专属特权。你是否曾幻想过拥有一款能够生成超逼真美女照片的AI工具?你渴望用自己的想象,把心中的女神通过科技变为现实吗?今天,我们就来深入探讨一款热门的AI生图工具——搜狐简单
购买笔记软件哪个便宜点
无论是日常生活还是工作学习中,大家都离不开笔记软件的支持。笔记软件是一款用于记录、整理和存储信息的工具,不同的产品有着不同的功能和特性,价格自然也不相同。那么哪个便宜呢,本文就为大家介绍一下为知笔记、思源笔记、Obsidian这三
犯太岁戴玉镯可以吗,犯太岁戴玉镯:能否带来好运?
女士犯太岁戴和田玉能够吗?和田玉作为一种被广泛用于佩戴和收藏的宝石一直以来都备受人们的推崇和喜爱。在传统的迷信观念中人们相信某些年份的生肖属于太岁的冲到了属于冲太岁的年份就需要特别留意自身的运势和健康以避免招惹不利之事。那
中国智慧政府行业市场动态分析及投资前景研判报告
​​本报告由智研咨询出品,经专业研究报告编撰团队实时监测与更新,最终得以呈现。报告研究基于研究团队收集到的大量一手和二手信息,研究过程综合考虑行业各种影响因素,包括市场环境、产业政策、历史数据、行业现状、竞争格局、技术革新
使用 5118 挖词工具时如何提高关键词挖掘的效率?
要提高使用 5118 挖词工具进行关键词挖掘的效率,可以考虑以下几点:1.明确目标和需求:在开始挖掘之前,清晰地确定您的业务目标、受众群体以及内容方向。这有助于更有针对性地选择关键词。2.精确输入核心关键词:确保输入的核心关键词能够
莉景天气
莉景天气,一般又称莉景天气预报。 全球特殊景观、天气服务类应用程序,支持近3000多个城市的朝霞、晚霞、云海、雾凇、星空、银河等16项特殊景观的预报、信息订阅、推送以及基础天气预报服务。更完善的预报功能、更贴心的场景化服务——莉
相关文章
推荐文章
发表评论
0评