c语言中打印浮点数,printf以"%d"输出浮点数-程序员宅基地

技术标签: c语言中打印浮点数  

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

曾看到printf的一道题,挺有意思,记录一下。

float value = 1.0;

printf('value_int = %dn', value);

printf('value_float = %fn', value);

应该输出什么?乍看这个题,很简单,浮点数1.0在内存中的存储形式是0x3f800000。float型在内存中占4Byte, int型也占4字节,按说就直接输出0x3f800000的十进制形式就可以呗。

谁知道一运行大跌眼镜,打印信息:

value_int = 0

value_float = 1.0

怎么回事?

使用gcc -S的参数把.c程序变成.s的汇编语言程序。我们可以看到:

flds -8(%ebp)

fstpl 4(%esp)

movl $.LC1, (%esp)

call printf

其中value的值被存在-8(�p)处,.LC1处存储'value = %dn'字符串。

flds 指令意为把单精度value的值放入FPU的st7寄存器(64bit)中,此时st7中的值为0x3f80000000000000

接着fstpl 指令把FPU的寄存器中的值以双精度的形式出栈,并存储在4(%esp)处。即(%esp+4)中的值为0x00000000, (%esp+8)值为0x3f800000.

调用printf时,由于指定打印方式是%d,故printf只读取(%esp+4)的四个字节并把它们解释为十进制整形--0,而不会顾及到(%esp+8)的正确值0x3f800000。

你可能还会纳闷,float同样在内存中只占4个字节,为什么指定%f时不会出错?答案就是如果你指定printf输出参数为%f,那么printf在内存中读取8字节,而不是仅仅是低地址的4 Byte. 写一段程序测试一下便知:

int main()

{

int a=1, b=2, c=3;

printf('%f, %dn', a,b,c);

return 0;

}

输出结果:

0.00000, 3

故可知,%f其实读取的是8 byte, 只不过a, b在转化成float型的时候,都因为值太小而被当作0.00000输出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35276012/article/details/117161661

智能推荐

Android Studio某些编译错误处理_only jar-type local dependencies are supported-程序员宅基地

文章浏览阅读4k次。Studio 有时候真的很奇怪,明明项目几天前都运行好好的,某天等你再次打开运行,就会出现特殊错误。现总结一些错误现象,减少开发人员不必要的时间浪费。第一个错误:Error:Failed to resolve: annotationProcessor如果你百度,你会发现大家说和butterknife 或者是apt等有问题,然后叫你更新google仓库。这种方案我试验过,但是往往都不凑效,请仔..._only jar-type local dependencies are supported

Cargo invocation has failed: Error: exit code: 101.解决办法_spurious network error-程序员宅基地

文章浏览阅读4.5k次。Rust语言在VS Code中编辑Rust “ Thebook ” 中第二章 “ 猜猜看 ”游戏代码时,尝试在cargo.toml 中添加rand依赖项,即cargo.toml[dependencies]rand = "0.7.3"在命令行键入$cargo build之后,发现了Cargo invocation has failed: Error: exit code: 101.这样一条弹窗提醒,提示crate启用失败。OUTPUT窗口提示如下:Running `cargo buil_spurious network error

制作一个广告字幕滚动效果的网页的心路历程_网页的滚动广告-程序员宅基地

文章浏览阅读823次。先看效果刚开始的需求是,制作一个类似电视广告字幕的效果,我没什么思路,后来看了字幕的实现方式,就是用css动画的移动实现,于是我开始了对这段动画的驾驭。我们写一个外面的块,宽度是100%,再写一个里面的块,再里面的块里放置内容。内容部分暂且不管,我主要讲实现思路。<body> <div id="app"> <template> <div class="marquee-outer-wrapper"&g._网页的滚动广告

RBF径向基神经网络多输入单输出的MATLAB实现_rbfs-程序员宅基地

文章浏览阅读161次。通过选择合适的径向基函数和调节相关参数,我们可以构建一个有效的神经网络模型,并利用其进行预测和函数逼近。输入层用于接收输入数据,隐藏层包含一组径向基函数,用于进行特征映射,输出层用于产生最终的预测结果。首先,我们需要准备训练数据。其中,P是输入数据,T是输出数据,goal是目标训练误差,spread是径向基函数的宽度参数,MN是隐藏层神经元的最小和最大数量,DF是隐藏层神经元扩展的步长。函数创建了一个RBF神经网络,设置了目标训练误差为0.1,径向基函数的宽度参数为1,隐藏层神经元的数量范围为10到15。_rbfs

燕大通勤车-程序员宅基地

文章浏览阅读50次。一,每一辆成功的燕大通勤车上,都有一个玩命的司机。二,燕大通勤车的空间就像海绵,挤挤总会有的。三,挤是一个客观发展的必然过程,比如说你在一二组团之间等车觉得车挤,往回走一站上车,到了大坡下站牌还得挤。四,大三学生:我的理想就是在我离校之前能挤上一次通勤车。五,先上车被踩,后上者踩其上。六,不是看谁先上车,坐到最后的才是赢家。七,上了燕大通勤车,把孟婆汤一喝,今生今世所有的痛苦都忘了。八,“阴间怎么...

php 面试题-程序员宅基地

文章浏览阅读195次。1.请自我介绍一下?答:我叫xxx,来自北京,20xx年毕业于xx大学计算机xx系,毕业后在武汉从事了x年的php开发工作,公司是一个外包公司,主要做微信开发,公众号推广,商城,论坛的开发2.你在公司负责那些项目?答:由于我们公司是一个外包公司,不可能只做一个项目,公司的项目都是交叉进行的,论坛,微信,商城我都做过?3.你为什么来深圳?答:因为我哥在这边,父母也希望兄弟间有个照...

随便推点

2. SDK与链码实现-程序员宅基地

文章浏览阅读2.4k次。2.1 创建 config.yaml 文件确认 Hyperledger Fabric 基础网络环境运行没有问题后,现在我们通过创建一个新的 config.yaml 配置文件给应用程序所使用的 Fabric-SDK-Go 配置相关参数及 Fabric 组件的通信地址进入项目的根目录中创建一个 config.yaml 文件并编辑$ cd $GOPATH/src/github.com/kongyi...

多元预测|开普勒算法优化注意力机制卷积神经网络结合双向门控循环单元KOA-Attention-CNN-biGRU实现光伏预测附matlab代码-程序员宅基地

文章浏览阅读1.4k次,点赞9次,收藏10次。光伏预测是光伏发电系统稳定运行和电网安全的重要保障。本文提出了一种基于开普勒算法优化注意力机制卷积神经网络结合双向门控循环单元(KOA-Attention-CNN-biGRU)的光伏预测模型。该模型通过开普勒算法优化注意力机制,增强了模型对光伏时间序列数据的局部特征提取能力;同时,结合双向门控循环单元,充分利用了光伏时间序列数据的长期依赖关系,提高了预测精度。在北神山光伏电站实际数据上的实验结果表明,所提出的模型在预测精度和鲁棒性方面均优于传统的光伏预测模型。引言。

2016,自律又惊喜的一年-程序员宅基地

文章浏览阅读143次。2016年度目标完成情况跑步,完成一次半程马拉松(已完成)练成六块腹肌(未完成,只有一块腹肌,应该是七分吃,三分练)趁早效率手册、三只青蛙、番茄工作法、践行GTD、100小时定律(践行效率不高,但基本都在做)敢于表达自我,专注于演讲技能 ,10次演讲 (8/10)英语能力提升,练习口语和阅读(上半年是以英语单词打卡为主,下半年是以英语每日一句,英语麦克风打卡,听的用开言英语,阅读是...

Pandas基础介绍-程序员宅基地

文章浏览阅读945次,点赞19次,收藏20次。Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。Pandas官网地址Pandas文档。_pandas

mac webrtc android,WebRTC 开发(五)编译与运行 Mac 工程-程序员宅基地

文章浏览阅读151次。Last login: Fri Oct 18 20:59:20 on ttys000The default interactive shell is now zsh.To update your account to use zsh, please run `chsh -s /bin/zsh`.For more details, please visit https://support.apple..._ardexternalsamplecapturer

::在C++中的意思_c++ ::代表-程序员宅基地

文章浏览阅读934次。::表示作用域,和所属关系。class Aint A::test() //表示test是属于A类的。关于::的具体解析:::是运算符中等级最高的,它分为三种:1)global scope(全局作用域符),用法(::name)。2)class scope(类作用域符),用法(class::name)。3)namespace scope(命名空间作用域符),用法(namespace::n..._c++ ::代表