我有一个形状
Rectangle
,它由以下参数组成:
int16_t x;
int16_t y;
uint16_t w;
uint16_t h;
x
和 y
是 int16_t
,因为矩形也可以从负位置开始
w
和 h
是 uint16_t
,因为矩形只能具有正的宽度和高度。 (理论上它也可以有负的宽度和高度,但在我的程序中这是不可能的,在这种情况下,坐标 x
和 y
会相应递减)
现在我的实际问题:在绘制矩形(逐像素)时,我实现了以下循环:
for(int16_t y_counter = y; y_counter < y+h; y_counter++) {
for(int16_t x_counter = x; x_counter < x+w; x_counter++) {
// ... draw pixel
}
}
现在的问题是我启用了编译器警告
-Wsign-compare
,这给了我以下警告:
警告:有符号和无符号整数表达式之间的比较 [-Wsign-compare]
现在我正在考虑避免此警告的最优雅(/最正确)的解决方案是什么。
我想出了以下解决方案:
for(int16_t y_counter = y; y_counter < y+(int16_t)h; y_counter++) {
for(int16_t x_counter = x; x_counter < x+(int16_t)w; x_counter++) {
// ... draw pixel
}
}
这消除了警告。但我有两个顾虑:
int16_t
所能容纳的更大。在这种情况下,这会导致溢出我知道我可以忽略/禁用此警告或保持原样,但我想知道是否有人想出了一个优雅的解决方案
for(int32_t y_counter = y; y_counter < y+static_cast<int32_t>(h); y_counter++) {
for(int32_t x_counter = x; x_counter < x+static_cast<int32_t>(w); x_counter++) {
// ... draw pixel
}
}
仅使用 32 位有符号整数。它们足够大,可以容纳 16 位有符号和无符号整数以及它们的和。
在大多数平台上,您的数学最终会以 32 位完成并无论如何都会被转换回来。