警告C4244:“功能”:从“ int”转换为“ float”,可能丢失数据

时间:2020-10-16 08:37:09

标签: c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <crtdbg.h>

int main(void)
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
    int request = 0;
    printf("How many powers of two? ");
    scanf("%d", &request);
    float* p_array = 0;

    p_array = malloc(sizeof(float)*request);

    for (int k = 0; k < request; ++k)
    {
        p_array[k] = (powf(2, k));
    }
    
    for (int k = 0; k < request; ++k)
    {
        printf("%f\n", p_array[k]);
    }

    free(p_array);
    p_array = 0;

    return 0;
}

这是我坚持了一段时间的练习,不确定如何处理,我在第20行中不断收到此错误-source.c(20):

警告C4244:“功能”:从“ int”转换为“ float”,可能会丢失数据。

这是p_array[k] = (powf(2, k));

我不知道如何解决这个问题。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

发出警告是因为(理论上,至少)int数据类型可以容纳更多的有效位数字(对于32位整数,通常为10位)。由float数据类型表示(通常仅在7或8左右)。

代码中的隐式转换位于powf的第二个参数中:您的 integer k索引将根据需要转换为float

您只需在k参数中添加 explicit 强制转换即可使警告静音(将 first 参数明确标记为float常量):

    p_array[k] = (powf(2.0f, (float)(k)));

答案 1 :(得分:0)

请注意,powf()在传递2和k时都期望有两个浮点值,它们都是整数。试用powf(2.f, (float)k)

相关问题