加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C:将浮点传递给函数

发布时间:2020-12-16 10:24:21 所属栏目:百科 来源:网络整理
导读:鉴于以下…… 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/Native(8241): Width 0.7 05-18 22:35:25.215: D/Native(8241)
鉴于以下……

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/Native(8241): Width 0.7

05-18 22:35:25.215: D/Native(8241): Width 0.7

05-18 22:35:25.215: D/Native(8241): Width 36893488147419103232.0

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

解决方法

你需要在使用之前声明fark.如第6.5.2.2节第6段所述:

If the expression that denotes the called function has a type that does not include a prototype,the integer promotions are performed on each argument,and arguments that have type float are promoted to double. These are called the default argument promotions.

(我大胆地强调了).

请注意,使用与隐式假定类型不兼容的类型定义fark是违反约束的,并且如果调用和定义位于同一转换单元中,则需要编译器发出诊断消息. gcc只会警告,但是clang拒绝了代码[错误:’fark’的冲突类型].如果调用和定义在不同的转换单元中,编译器当然不能诊断错误,但通过具有不兼容类型的表达式调用函数在任何情况下都会调用未定义的行为.

当值0.7f被转换为double时(我假设使用IEEE754 32位表示浮点运算,并且使用IEEE754 64位表示加倍),则得到的值为

0.699999988079071

其位模式(十六进制表示法)是

0x3FE6666660000000

(偏差指数为1022,对应有效指数-1,有效数为1.6666660000000).

这是通过 – 在堆栈或寄存器 – 到fark.

当fark从该表示中读取32位时 – 因为它期望每个定义一个浮点数 – 取决于double的传递方式,它可以读取高阶32位或低阶32.

在这种情况下,它确实读取了低位32位,从而产生具有位模式的浮点值

0x60000000

其偏差指数为0xC0 = 192,对应于无偏指数192-127 = 65和有效数1.000000.换句话说,那就是浮动表示

2^65 = 36893488147419103232

这是印刷的价值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读