考虑到以下情况..。
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);
}这个输出..。
05-18 22:35:25.215: d/原住民(8241):宽度0.7 05-18 22:35:25.215: d/原住民(8241):宽度0.7 05-18 22:35:25.215: d/原住民(8241):宽度36893488147419103232.0
关于最后一个我错过了什么?
发布于 2013-05-18 23:10:13
在使用fark之前,您需要声明它。如第6.5.2.2节第6段所述:
如果表示被调用函数的表达式的类型不包括原型,则对每个参数执行整数提升,将具有
float类型的和参数提升为。这些被称为默认的参数提升。
(我加了粗体强调)。
请注意,使用与隐式假定类型不兼容的类型定义fark是一种约束冲突,如果调用和定义位于同一个转换单元中,则需要编译器发出诊断消息。gcc只是在那时才发出警告,但他拒绝接受代码error: conflicting types for 'fark'。如果调用和定义位于不同的翻译单元中,编译器当然不能诊断错误,但是通过不兼容类型的表达式调用函数在任何情况下都会调用未定义的行为。
当将值0.7f转换为double (我假设float使用IEEE754 32位表示形式,并使用double IEEE754 64位表示)时,您将得到一个
0.699999988079071其位模式(以十六进制符号表示)为
0x3FE6666660000000(有偏指数为1022,对应于-1的有效指数,意义为1.6666660000000)。
在堆栈或寄存器中传递给fark。
当fark从该表示中读取32位时- -因为它期望在定义的-中包含一个float,这取决于double是如何传递的,它可以读取高阶32位或低阶32位。
在本例中,它读取了较低的32位,从而生成具有位模式的float值。
0x60000000它有一个0xC0 = 192的有偏指数,对应无偏指数192 - 127 = 65和1.000000。换句话说,这是
2^65 = 36893488147419103232这是打印出来的值。
https://stackoverflow.com/questions/16629647
复制相似问题