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

曾看到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输出。

c语言printf源码浮点数,printf以%d输出浮点数相关推荐

  1. 超大气APP下载页双语多国语言网站源码

    介绍: 超大气APP下载页双语多国语言网站源码,自带4国语言源码,界面高端大气适合做软件下载页面! 解压下载修改下载链接,上传根目录即可使用! 网盘下载地址: http://kekewl.cc/NaX ...

  2. 扫雷c语言完整源代码,C语言扫雷源码

    C语言扫雷源码 #include #include #include #include /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xf ...

  3. C语言项目源码,C语言源码大全

    一.C语言源码大全 C语言是一门通用计算机编程语言,广泛应用于底层开发.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.尽管 ...

  4. 易语言mysql修改语句_易语言-MySQL-update源码例程

    易语言中MySQL的update可以用两种方式来对字段进行更新,下面就这两种方式贴出源码.涉及的数据库在文章易语言-MySQL-select源码例程..版本 2 .支持库 MySQL .程序集 窗口程 ...

  5. C语言MD5源码及实例

    C语言 MD5源码 md5c.h: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /* POINTER defines ...

  6. c语言循环写回合制小游戏_【资源】60个C语言项目源码免费领取!

    序言 今天的资源特意是为大三.大四的童鞋准备的, 整理了一波有关于C语言开发的游戏.系统.效果.小项目的源码!!源码!!源码!! 小编之前发过一波毕业项目的资源, 还没有获取的伙伴,直接申请进群就能获 ...

  7. 海外多语言商城源码项目开发搭建 第一篇

    前一段时间开发了一套关于海外多语言商城源码项目,现在整理发出来,给大家参考和学习. 程序采用主流的框架:ThinkPHP 数据库采用的是:MySQL 支持语言:中文,英文,西班牙语,葡萄牙语等 程序开 ...

  8. 计算机专业-C语言--毕业设计源码(24套)

    计算机专业-C语言--毕业设计源码(24套) 以下是24套计算机专业C语言毕业设计源码的列表:资源下载: https://download.csdn.net/download/weixin_56863 ...

  9. 最新版基于TP开发的9国语言海外多语言抢单源码+9色前端UI

    demo软件园每日更新资源,请看到最后就能获取你想要的: 1.最新版基于TP开发的9国语言海外多语言抢单源码+9色前端UI 今天没事测试了一下这套源码,基本没什么大问题,只是需要自己设置一下伪静态和选 ...

最新文章

  1. 如何破解汽车-快速的速成课程
  2. linux 开启独立iptables日志
  3. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
  4. promise的状态以及api介绍_Promise从入门到自定义 | 尚硅谷Promise新版视频发布!
  5. 东华理工大学arm试卷_ARM东华理工大学2015-2016试卷A
  6. iOS设计模式-适配器
  7. 微信5.0安卓内测版下载
  8. 手把手教你学DSP(TMS320X281X) 2020-11-30
  9. 在计算机内部.机器码的形式,在计算机内部,机器码的形式是____。
  10. nginx上传文件大小报错500的解决办法
  11. 解决win10新建文本文档内容可以打开但显示图标不对的问题
  12. java代码随机取名字
  13. obj[key].obj['key'],obj.key的区别
  14. 无他,唯手熟尔-前端实习面试题篇
  15. HDU6669 Game
  16. 编写批量修改扩展名脚本
  17. 还不懂PID控制?精华都在这了!
  18. 极路由s1有wds_极路由1、1s等机型刷OpenWrt--成为真正的极客
  19. python3 字典遍历操作
  20. 操作系统实验二进程的创建控制实验(含代码及实验心得)

热门文章

  1. 华为发布鸿蒙开发版,华为发布首款鸿蒙开发板,基于RISC-V架构,软硬生态一起抓?...
  2. python基础网易_看看你的Python基础怎么样?
  3. Python操作ElasticSearch条件查询
  4. qt读oracle时间戳,QT解析时间戳与微秒级精度
  5. 接手一个APP,如何从0到1去做测试体系的搭建?
  6. 软件测试入坑建议:新手零基础怎么入门软件测试?你还缺这几份资料!
  7. kafka sasl java_kafka 添加SASL鉴权
  8. python创建员工_python作业员工信息表程序(第四周)
  9. 卧式储罐液位体积计算公式excel_2020晋中化工防腐储罐订做欢迎来电-环保设备...
  10. libsvm-3.1-[FarutoUltimate3.1Mcode]——辅助函数简介(修改)