0

負の値を含む計算があります。

row = (stagePosition - col) / PHNumRow;

stagePositionが-7で、colが1であるとします。これらは両方とも行を含めてNSIntegerです。PHNumRowは8です。

PHNumRowがNSIntegerの場合、期待する結果が得られます:-1。ただし、PHNumRowがNSUIntegerの場合、結果はガベージになります。

除数が署名されていないか署名されているかが重要なのはなぜですか?結果をunsignedintに入れていません。

4

1 に答える 1

4

整数拡張のため。右辺が評価されると、すべての引数が式のオペランドの最上位タイプにプロモートされます。これは、PHNumRow符号なしの場合、符号なし整数になります。コンパイラは次のようなことをします。

((NSUInteger)stagePosition - (NSUInteger)col) / PHNumRow;

が負であるためstagePosition、ラップアラウンドがあり、計算がブームになります。

于 2009-03-14T17:42:53.420 に答える