C unsigned char算术运算不能按预期工作

时间:2013-04-20 13:00:29

标签: c++ type-conversion arithmetic-expressions

这是我的代码片段;

Npp8u * imageHost;  
typedef unsigned char Npp8u;
...
for (int i=0;i<nHeight;++i)
    {
        for (int j=0;j<nWidth;++j)
        {
            printf("number_befre : %u\n",imageHost[i*nWidth+j] );
            imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-Npp8u(min);
            imageHost[i*nWidth+j] = imageHost[i*nWidth+j]/(max-min);
            printf("number : %u\n",imageHost[i*nWidth+j] );
        }
    }
...

某些值已分配给max = 202min = 0,并从imageHost中提取。我通过调试纠正了它,但imageHost的内容对于整个元素都是0。我能做些什么来使这些陈述以合理的精度工作?这是关于我使用的数据类型的限制吗?

3 个答案:

答案 0 :(得分:2)

您正尝试将数字标准化为0.0到1.0之间。但是您选择的数据类型不适合它,因为它只能处理整数。你需要像这样的代码

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
vector<float> normalizedImageHost(nHeight*nWidth)
...
for (int i=0;i<nHeight;++i)
{
    for (int j=0;j<nWidth;++j)
    {
        normalizedImageHost[i*nWidth+j] = (float)(imageHost[i*nWidth+j] - min)/
            (max - min);
    }
}

另一种选择是保留Npp8u但使用缩放系数。例如,我们可以将所有值乘以最大Npp8u值,即255。

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
...
for (int i=0;i<nHeight;++i)
{
    for (int j=0;j<nWidth;++j)
    {
        imageHost[i*nWidth+j] = (Npp8u)((255.0*(imageHost[i*nWidth+j] - min))/
            (max - min));
    }
}

答案 1 :(得分:0)

IF imageHost[i*nWidth+j]小于max-min

imageHost[i*nWidth+j]/(max-min)

将为零。因为unsigned char无法在[0.0 .. 1.0]

之间存储实际值

为了更好的准确性,您应该使用浮点运算。

答案 2 :(得分:0)

我猜你的问题是imageHost内存。检查它的内存。(如果可能,发布前一行) 或者为第一行变量值(第二行断点)调试程序:

Npp8u  x=Npp8u(min);
imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-x;

你获得了imageHost的记忆(这样做):

Npp8u ** imageHost=new *Npp8u*[nHeight];
for(int i=0;i<nHeight;i++)
     imageHost[i]=new Npp8u[nWidth];