For 循环:有符号/无符号整数表达式警告

问题描述 投票:0回答:1

我有一个形状

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
    所能容纳的更大。在这种情况下,这会导致溢出

我知道我可以忽略/禁用此警告或保持原样,但我想知道是否有人想出了一个优雅的解决方案

c integer
1个回答
0
投票
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 位完成并无论如何都会被转换回来。

© www.soinside.com 2019 - 2024. All rights reserved.