灵感来自此博客上“当我混合有符号和无符号整数时会发生什么?”下的代码片段。我决定用几个不同的有符号和无符号整数值运行它并观察行为。
这是原始片段(略有修改,但意图仍然相同)
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
int c = (a+b > 6);
unsigned int d = a+b;
printf("<%d,%u>", c, d);
}
输出:<1,4294967282>
a = 6
现在,当我为和运行相同的程序时b = -1
输出:<0,5>
如果我正确理解C 语言的积分提升规则,b=-1
应该提升为无符号整数,那就可以了4294967295
。就像原始示例一样,我们应该得到<1,4294967301>
. 但这不是我们得到的。
我能想到的这种行为的唯一原因是这些隐式类型转换发生在算术运算之后。然而,同一篇博客文章还说,首先提升有符号整数,然后进行评估,这使我的推理无效。
这种行为的真正原因是什么?以及这两个示例有何不同。
PS我知道有很多关于SO的问题与这个问题相似/相关。但是我没有遇到任何特别解决这个问题或有助于理解此类代码片段的问题。如果发现是重复的,我很乐意接受这个问题被关闭。