【发布时间】:2018-08-24 16:46:53
【问题描述】:
考虑:
uint16_t x;
uint16_t y;
y = 0;
x = y - 1;
X 将是一个疯狂的数字。 See other SO articles for the "why" and to learn about 2's compliment.
(我不是在问为什么会这样。我知道为什么。我在问别的问题。请继续阅读。)
如果你打开 gcc 标志 -Wconversion,上面这段完全有效的 C 代码将抛出 conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value 那是编译器试图帮助我们不要搞砸。而且我倾向于在打开此类警告的情况下进行编程,因为它们可以帮助我避免搞砸。
但是,在实际情况下,我们可能会使用 unsigned int 作为计数器并希望减去 1 而不会收到此警告。此外,我们想将其用作计数器,将其降至零,然后停止。要在 C 中做到这一点,我们必须进行某种检查。但是,这种检查代码会违反 gcc 警告。
就像上面的代码。
我想要我的蛋糕,我也想吃它。
什么是优雅的解决方案?
【问题讨论】:
-
使用显式转换?
-
只是不要使用窄类型进行算术运算。它们存在的唯一原因是节省存储空间。
-
@EugeneSh.NOPE.... 使用正确的无符号文字(将
U附加到文字字符串)使用显式强制转换将使警告静音,但不会避免有符号和无符号转换,给出一个可能改变的结果。