【发布时间】:2017-12-02 21:15:29
【问题描述】:
灵感来自 “当我混合有符号和无符号整数时会发生什么?”下的 blog 上的代码 sn-p,我决定使用几个不同的有符号和无符号整数值来运行它观察行为。
这里是原始的 sn-p(略有修改,但意图仍然相同)
#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);
}
输出:
现在,当我为 a = 6 和 b = -1 运行相同的程序时
输出:
如果我正确理解了 C 语言的 Integral Promotion 规则,b=-1 应该被提升为无符号整数,那将是 4294967295。就像原始示例一样,我们应该得到<1,4294967301>。但这不是我们得到的。
我能想到这种行为的唯一原因是这些隐式类型转换发生在算术运算之后。但是,同一篇博文还说,首先提升有符号整数,然后进行评估,这使我的推理无效。
这种行为的真正原因是什么?以及这两个示例有何不同。
P.S 我知道有很多关于 SO 的问题与此问题相似/相关。但是我没有遇到任何特别解决这个问题或有助于理解此类代码 sn-p 的问题。如果发现是重复的,我很乐意接受这个问题被关闭。
【问题讨论】:
-
我不明白问题出在哪里。这一切对我来说似乎都是合理的行为。是不是
c在6、-20的情况下应该是0? -
第一个输出基本是“是4294.....在6之上,然后是1,然后是数字4294....”。第二个输出是“是 5 高于 6,然后是 1,否则为 0,然后是数字 5”。 您的问题是什么?
-
让我总结一下。是的,4294967282 > 6,所以是 1。不,5 不是 > 6,所以是 0。你的问题是什么?
-
请记住,如果您将两个数字 a+b 相加,其中 a 是无符号的,b 是有符号的,那么如果您简单地将带符号的值重新解释为就位的含义而言,是一个无符号值。
-
? 1 : 0是不必要的。>运算符产生类型为int的结果,如果条件为真,则为1,如果为假,则为0。
标签: c unsigned-integer integer-promotion signed-integer