首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:将浮点传递给功能

C:将浮点传递给功能
EN

Stack Overflow用户
提问于 2013-05-18 22:36:43
回答 1查看 2K关注 0票数 3

考虑到以下情况..。

代码语言:javascript
复制
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

关于最后一个我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位表示)时,您将得到一个

代码语言:javascript
复制
0.699999988079071

其位模式(以十六进制符号表示)为

代码语言:javascript
复制
0x3FE6666660000000

(有偏指数为1022,对应于-1的有效指数,意义为1.6666660000000)。

在堆栈或寄存器中传递给fark

fark从该表示中读取32位时- -因为它期望在定义的-中包含一个float,这取决于double是如何传递的,它可以读取高阶32位或低阶32位。

在本例中,它读取了较低的32位,从而生成具有位模式的float值。

代码语言:javascript
复制
0x60000000

它有一个0xC0 = 192的有偏指数,对应无偏指数192 - 127 = 651.000000。换句话说,这是

代码语言:javascript
复制
2^65 = 36893488147419103232

这是打印出来的值。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16629647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档