1

私はC ++でトロイダル2Dグリッド(つまり、側面でラップアラウンド)で作業していて、明らかなネイバー/相対ポイント関数を作成しました:

point neighbor(point p0, int dx, int dy)
{
    point p=p0;
    p.x += dx;
    p.y += dy;
    p.x %= width; if(p.x<0) p.x += width;
    p.y %= height; if(p.y<0) p.y += height;
    return p;
}

この関数の実装は些細なことのように思えたので、なぜ自分のプログラムが機能しないのかまったくわかりませんでした。

% 演算子は理解できたと思いますが、否定的な結果をチェックすることさえ覚えていました。それでも、私はそれを試し始めました。「幅」は値が160の符号なしだったので、試しました:

cout << (-1) % 160u;

...そして95という結果を見てショックを受けました。

一体何が起こっているのですか?

4

1 に答える 1

1

結局のところ、私のプログラムは unsigned 160u を int にキャストしませんでした。
むしろ、-1 は unsigned に変換されて 4294967295 になり、実際には 160 で変更すると 95 になります。

c++ がそうする理由は私にはわかりませんが、他の人が私の経験から学ぶことができるようにこれを投稿しています。結論: !を使用する場合は、符号付き整数と符号なし整数を混在させないでください。%

于 2012-10-13T23:35:21.763 に答える