Loading

[cocos2d-x]用getContentSize()返回的值用CCLOG打印必须用%f

今天写代码,又遇到了一个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

posted @ 2017-08-19 11:10  李正浩  阅读(144)  评论(0编辑  收藏  举报