数学的に賢明な比較に興味がある場合は、直接恣意的に比較しないでくださいunsigned
。signed ints
これは、C(++) の算術演算が通常の算術演算ではないためです。
asigned int
と anを含む C(++) 式ではunsigned int
、signed int
最初に が an に変換されてからunsigned int
演算が実行されます (+、*、< など)。
signed int
aと anを正しく比較するには、 unsigned int
C(++) の「算術規則」と、プログラミング言語によって義務付けられていて初心者には見えない型/値の変換を考慮する必要があります。
したがって、次のように 2 つを比較できます。
/* returns -1 if s < u,
returns 0 if s == u,
returns 1 if s > u */
int CompareSignedUnsigned(int s, unsigned u)
{
if (s < 0) return -1; // negative is always smaller than 0 or positive
if (s < u) return -1; // obvious
if (s > u) return 1; // obvious
return 0; // obvious
}
適切な種類の整数を使用することは良いアドバイスですが、1 つのサイズがすべてに適合しない場合があります。画面上の座標はそのような領域の 1 つであり、座標に署名を付けるのが合理的ではありません。
たとえば、画面上にボックスをレンダリングするルーチンが必要であり、画面の外側 (画面に移動) から外側 (画面に移動) で終了する、画面上を移動するボックスを描画できるようにしたいとします。
次のような API を選択した場合:
void DrawBox(unsigned x, unsigned y, unsigned width, unsigned height, color c);
この関数のユーザーは、そのボックスの一部を描画するときに、一部が画面上にあり、別の部分が画面外にある場合に、追加の計算を行う必要があります。すべては、元の/クロップされていないボックスが実際にすべて画面に表示されていないことを関数に伝える方法がないためです。
ここで、代わりにこれを選択した場合:
void DrawBox(int x, int y, unsigned width, unsigned height, color c);
追加のクロッピング計算を関数内に移動すると、突然、この関数のユーザーは非常に単純なコードを記述できるようになります。次のように簡単です。
for (int x = -100; x < SCREEN_WIDTH + 100, x++)
DrawBox(x, SCREEN_HEIGHT / 2, 100, 50, GREEN);