截断从double到float?

时间:2016-03-15 16:44:19

标签: c++ floating-point

#include <iostream>

using namespace std;

int main(void)
{
    float haha[2];
    float (&ptr)[2] = haha;
    ptr[0] = 0.54;
    ptr[1] = 0.65;

    cout << haha[0] << '\n' << haha[1];
    system("pause");
    return 0;
}

我目前正在使用引物C ++学习复杂的数组声明,在我的代码中,由于某些原因,我收到Warning C4305 '=': truncation from 'double' to 'float' Arrayptr[0] ptr[1]的警告但我不知道看到双打,但当我修改代码

ptr[0] = (float)0.54;
ptr[1] = (float)0.65;

我似乎没有任何警告可以解释为什么?提前谢谢!

2 个答案:

答案 0 :(得分:9)

立即值或文字,例如33.14"Hello"在C ++中有类型。 3.14的类型为double,大于float并导致此警告。 “更大”是指如果转换后它可以保存不适合float的值,此时语言可能会以意外的方式运行。

您可以使用后缀来指定所需的类型,3.14F将浮动。

同样,对于整数,对于无符号和3U,您有3L长整数,甚至是{{1}}的组合。 C ++ 11还具有用户定义的后缀。

答案 1 :(得分:5)

从标准2.14.4开始,Floating literals

  

浮点文字的类型是double,除非后缀明确指定。后缀fF指定了float,后缀lL指定了long double。

然后,浮点文字总是加倍,除非由后缀明确指定。铸造浮动也可以起作用(小心适合双倍大小而不是漂浮物的数字),但是当你唯一的选择(不是这种情况)时你应该使用铸造。在您的代码中只需使用后缀(0.54f),就可以了。