鉴于以下......
void test(){
float a = 0.7f;
LOGD("Width %.1f",0.7f);
LOGD("Width %.1f",a);
fark(a);
}
void fark(float test){
LOGD("Width %.1f",test);
}
Run Code Online (Sandbox Code Playgroud)
这个输出....
05-18 22:35:25.215:D/Native(8241):宽度0.7
05-18 22:35:25.215:D/Native(8241):宽度0.7
05-18 22:35:25.215:D/Native(8241):宽度36893488147419103232.0
关于最后一个我错过了什么?
Dan*_*her 12
您需要fark在使用之前声明.如第6.5.2.2节第6段所述:
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有类型的参数
float提升为double.这些被称为默认参数促销.
(我大胆地强调了).
请注意,fark使用与隐式假定类型不兼容的类型进行定义是违反约束,并且如果调用和定义位于同一转换单元中,则需要编译器发出诊断消息.gcc只会警告,但是clang会拒绝代码[ error: conflicting types for 'fark'].如果调用和定义在不同的转换单元中,编译器当然不能诊断错误,但通过具有不兼容类型的表达式调用函数在任何情况下都会调用未定义的行为.
当值0.7f转换为double(我假设float使用IEEE754 32位表示和doubleIEEE754 64 位表示)时,您得到一个值
0.699999988079071
Run Code Online (Sandbox Code Playgroud)
其位模式(十六进制表示法)是
0x3FE6666660000000
Run Code Online (Sandbox Code Playgroud)
(偏差指数为1022,对应有效指数-1,有效数为1.6666660000000).
这是通过 - 在堆栈或寄存器 - 来fark.
当fark从该表示中读取32位时 - 因为它期望float按照其定义 - 取决于如何double传递,它可以读取高阶32位或低阶32.
在这种情况下,它确实读取了低位32位,从而产生float了位模式的值
0x60000000
Run Code Online (Sandbox Code Playgroud)
它具有偏差指数0xC0 = 192,对应于无偏指数192 - 127 = 65和有效数1.000000.换句话说,那就是float代表
2^65 = 36893488147419103232
Run Code Online (Sandbox Code Playgroud)
这是印刷的价值.
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |