3

如果在装有 Visual Studio 的 PC(运行 Windows 7 的 cpu Intel i7)或我的 Android 手机 (P880) 上执行以下函数(从 .cpp 文件中提取),则会给出两种不同的结果(即输出缓冲区int_image不同)。两个输入缓冲区im1im2,类型int8( 的同义词char)完全相同(已检查),以及参数wh。我不明白为什么会这样:

void  Compute(int8* im1,
              int8* im2,
              int w, 
              int h,
              int* int_image)
{
  int index = 0;
  int sum;

  for(int i = 0; i<h; i++)
  {
    // reset this column sum
    sum = 0;

    for(int j = 0; j<w; j++)
    {
      int pn;
      int8 v1, v2;
      v1 = im1[index];
      v2 = im2[index];
      pn = v1*v2;
      //pn = ((int)im1[index]) * ((int)im2[index]);
      sum += pn;
      if (i==0)
        int_image[index] = sum;
      else
        int_image[index] = int_image[index - w] + sum;

      index++;
    }
  }
}

笔记。char 图像 im1 和 im2 的大小可能会发生整数溢出(但我认为这种情况由两个编译器平等处理,但在这一点上我不太确定)。

4

1 回答 1

2

找到了错误的根源。我定义int8char,相信默认情况下它是一个有符号字符。相反,它在 gcc 上未签名,而在 Visual C++ 上签名。我不知道标准是怎么说的,但我建议所有程序员在为signed charandunsigned char定义自己的宏时明确int8使用uint8在 stackoverflow 上对此进行了有趣的讨论。

于 2012-12-23T14:21:39.397 回答