今天写代码,又遇到了一个bug,开始还以为是我自己哪写错了,没想到竟然在这里出错?







而width和height的类型是float类型,为什么必须用%d打印?接着我查看了一下源码:



如果没理解错的话,CCLOG用的应该是printf打印,那么接下来就很好懂了,我又去做了一个测试:

%d输出float类型

有一些基础必须要知道:

1、float类型是采用IEEE754标准,1位数符,8位阶码(移码表示,要减去127偏置值),23位尾数位(并且隐藏了一位最高位位1,即1.XXX中1被隐藏了)。

2、double类型和float类型相似,只不过是1位数符,11位的阶码,后面52位的尾数位。

3、printf()在输出float类型时候,会自动提升为double类型,并且如果以%d输出的话,只能输出后面的32位。

4、intel的CPU采用的是小端存储,如下图:



真实的值应该是3f-80-00-00(十六进制)

知道了上面这些,输出的错误也就可以理解为什么输出会是0了,%lld输出的是长整型,能够输出64位的数据,所以结果为4607182418800017408,那么这个值代表了什么呢?我们用计算器来转换一下:

很明显,就是把float类型转换成了double类型,高的111111111表示阶码,而用%lld和%d输出都不会进行类型转换为int,所以是直接输出,而%d只能输出低32位,也就是0,而lld能输出64位,所以输出的结果就是4607182418800017408。

%f输出int

知道了这些,用%f输出int其实也就很容易理解了,将int数据的格式按照double类型格式来理解,大部分情况下输出应该都是0,因为比较小的整数按照double类型来理解,阶码都是0-1023,这样看基本就等于1.00000……….003232这样的值,然后%f默认输出小数点后6个0(没记错的话,反正就差不多啦),所以只要你取的值不是特别大,最后输出的永远都是0.000000

最新文章

  1. salesforce 零基础学习(五十九)apex:param使用以及相关的疑惑
  2. xtrabackup备份rds记录
  3. CCFlow SDK模式开发
  4. LINQ Count/Sum/Min/Max/Avg
  5. 棒棒的毛笔字PS教程
  6. JAVA方法和本地方法(转载)
  7. hibernate篇章四-- Hibernate配置文件中hiberante.hbm2ddl.auto四个参数的配置
  8. COJ 2110 Day7-例3
  9. python处理mysql慢查询日志
  10. Android应用的基本组件介绍和签名Android应用程序
  11. EF下lambda与linq查询&&扩展方法
  12. Django return
  13. laravel PC内部方法调用
  14. python:从迭代器,到生成器,再到协程的示例代码
  15. Oracle分析函数-排序排列(rank、dense_rank、row_number、ntile)
  16. nginx启动重启与升级以及检测配置文件
  17. eclipse git 忽略文件
  18. Xcode添加全局引用文件pch
  19. SpringMVC高级参数绑定(数组和List)
  20. 对SingleTask和TaskAffinity的理解

热门文章

  1. java集合框架复习----(4)Map、List、set
  2. 生成随机数的几种方法、Math.random()随机数的生成、Random()的使用
  3. JavaScript基础&实战 JS中正则表达式的使用
  4. NLP之基于Seq2Seq的单词翻译
  5. ML-梯度下降法的详细推导与代码实现
  6. scrapy 解析xml格式的数据
  7. costool - 腾讯云cos快捷工具。
  8. 系统整理K8S的配置管理实战-建议收藏系列
  9. java学习之IO流
  10. 《回炉重造》——Lambda表达式