我是C初学者,需要快速澄清有关整数.
当你将某个东西作为一个32位的int转换时,一半的位被分配给负整数.因此,如果您知道您将始终具有正整数,则将某些内容作为无符号整数推送应该最大化您的正位,因此当您知道输出将始终为正时更有意义.这是真的?
谢谢!
考虑:
uint16_t x;
uint16_t y;
y = 0;
x = y - 1;
Run Code Online (Sandbox Code Playgroud)
X将是一些疯狂的数字. 请参阅其他SO文章的"为什么",并了解2的赞美.
(我不是在问为什么会这样.我知道为什么.我在问别的.请继续阅读.)
如果你打开gcc标志-Wconversion,这个完全有效的C代码将抛出conversion to ‘uint16_t {aka short unsigned int}’ from ‘int’ may alter its value那就是编译器试图帮助我们不要搞砸了.而且我倾向于打开这样的警告,因为它们可以帮助我避免搞砸.
但是,有一些现实情况,我们可能会使用unsigned int作为计数器,并希望减去1并且不会得到此警告.此外,我们希望将其用作计数器,将其降至零,然后停止.要在C中执行此操作,我们必须进行某种检查.但是,这种检查代码会违反gcc警告.
像上面的代码一样.
我想要我的蛋糕,我也想吃它.
这个优雅的解决方案是什么?