警告错误问题

时间:2011-05-21 05:26:21

标签: c++

程序

void DibLaplacian8Direct(CDib sourceImg)
{   
    register int i,j;
    int w = sourceImg.GetWidth();
    int h = sourceImg.GetHeight();
    CDib cpyImage = sourceImg;
    BYTE** pSourceImg = sourceImg.GetPtr();
    BYTE** pCpyImage = cpyImage.GetPtr();
    float G;
    for(j =1;j<h-1;j++)
    {
        for(i =1;i<w-1;i++)
        {
            G = -1*pCpyImage[j-1][i-1] + -1*pCpyImage[j-1][i] + (-1)*pCpyImage[j-1][i+1]+
                (-1)*pCpyImage[j][i-1] + 8*pCpyImage[j][i]    + (-1)*pCpyImage[j][i+1]+
                -1*pCpyImage[j+1][i-1]  + (-1)*pCpyImage[j+1][i] + -1*pCpyImage[j+1][i+1];
            pSourceImg[j][i] = (BYTE)G;
        }
    }
}

警告错误:

警告..无法从int转换为浮动..

  

警告1警告C4819:该文件包含无法在当前代码页中表示的字符(1257)。以Unicode格式保存文件以防止数据丢失D:\ 2nd \ imagetool \ dibfilter.cpp 1 1 ImageTool

我不明白为什么它让我警告int浮动。 并警告1, 我正在使用VS 2010 ..我不知道我在StdAfx.h包含文件中收到警告。 艾米,我可以帮助我。

2 个答案:

答案 0 :(得分:1)

第一个警告是由于float只有六位有效数字而int可能有更多数字。如果确实如此,则精度会丢失。

通常,您无法将 整数转换为浮点 ,而不会丢失数据。此外,您无法将 浮点数转换回整数 而不会丢失欺骗位置,因此您会再次收到警告。

上述案例的简单简约代码示例:

#include<iostream>
using namespace std;

int main()
{
    int a=10;
    int b=3;

    float c;
    c=a/b;

    cout << c << endl;
    return 0;
}

如果您确定数据在范围内并且不会有任何精度损失,您可以使用类型转换来消除警告。

G = (float) (.....)

检查this第二次警告。

要摆脱第二个警告,您需要以Unicode格式保存文件。

转到文件 - &gt;高级保存选项,然后选择要将其保存为的新编码。 UTF-8或UNICODE代码页1200是您想要的设置。

答案 1 :(得分:0)

重要的是要了解编译器告诉你什么警告20.问题是浮点数只有23位精度,而整数有31位。如果你的数字大于2 ^ 23,你将失去通过存储在浮点数中的低位。

现在你的号码永远不会超过2 ^ 23,所以你很好。不过,重要的是要知道这里发生了什么。这个警告是有原因的,而且只是在不了解正在发生的事情的情况下投入演员可能会让你感到困惑。

在您的具体情况下,我并不清楚您使用浮动的原因。您正在添加九个整数,其中任何一个都不能大于2 ^ 11。你有足够的精度在int中做到这一点。使用浮动只会降低你的程序速度。 (可能相当多。)

最后,对BYTE的最后一次投射令人担忧。如果您的价值超出范围会怎样?可能不是你想要的。例如,如果BYTE是无符号的,并且你的浮点数最终为-3.0,那么你将存储253作为结果。