3

int_image次の関数(.cppファイルから抽出)は、Visual Studioを搭載したPC(Windows7を実行するcpuIntel i7)またはAndroidフォン(P880)で実行すると、2つの異なる結果(つまり、出力バッファーが異なる)を示します。タイプ(の同義語)の2つの入力バッファーim1とは、パラメーターとと同様に、まったく同じ(チェック済み)です。なぜこれが起こっているのか理解できません:im2int8charwh

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のサイズは、整数のオーバーフローが発生する可能性があります(ただし、この種の状況は2つのコンパイラーによって同等に処理されると思いますが、現時点ではよくわかりません)。

4

1 に答える 1

2

エラーの原因が見つかりました。デフォルトでは符号付きの char であると信じて、int8として定義しました。char代わりに、gcc では署名されていませんが、Visual C++ では署名されています。標準が何を言っているのかわかりませんが、すべてのプログラマーに明示的に使用することをsigned charお勧めしunsigned charます。 これに関する興味深い議論は、stackoverflow にあります。int8uint8

于 2012-12-23T14:21:39.397 に答える