如果您对数学上合理的比较感兴趣,则unsigned
不应直接进行任意比较。signed ints
那是因为 C(++) 的算术不是你的常规数学算术。
在涉及 asigned int
和 an的 C(++) 表达式中unsigned int
,signed int
首先将 a 转换为 an unsigned int
,然后执行操作(+、*、< 等)。
要正确比较 asigned int
和 an,unsigned int
您应该考虑 C(++) 的“算术规则”以及编程语言强制要求且外行人看不到的类型/值转换。
因此,您可以像这样比较两者:
/* 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
}
至于使用正确的整数类型,这是一个很好的建议,但有时一种大小并不适合所有人。屏幕上的坐标就是这样一个区域,在其中对坐标进行签名可能是非常合理的。
想象一下,例如,您想要一个例程在屏幕上渲染一个框,并且您希望能够绘制一个在屏幕上移动的框,从屏幕外部开始(移入其中)并在屏幕外部结束(移出)。
如果您选择这样的 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);