【问题标题】:Integer promotion example in C [duplicate]C中的整数提升示例
【发布时间】:2018-08-06 15:32:03
【问题描述】:
void foo(void) {
    unsigned int a = 6;
    int b = -20;

    if (a+b > a) {
        printf("> a");
    } else {
        printf("< a");
    }
}

我试图了解上面的整数提升示例发生了什么。我知道a = 6b = -20 的输出应该是&gt; a,因为b 被提升为unsigned int。但是,如果我分配 b = -5,则输出将转到 &lt; a。由于值b = -5 也被提升为unsigned int,所以在这种情况下输出不应该相同吗?

【问题讨论】:

  • 这个FAQ已经被问过很多次了。

标签: c integer-promotion


【解决方案1】:

原因与有符号值转换为无符号值的方法有关。

C standard 的第 6.3.1.3 节关于有符号和无符号整数的转换规定了这是如何发生的:

2 否则,如果新类型是无符号的,则通过反复加或减一的最大值来转换该值 可以用新类型表示,直到值在 新类型。60)

...

60) 规则描述的是数学值的算术运算,而不是给定类型表达式的值。

在您的示例中,b 等于 -20,当它转换为无符号时,UINT_MAX + 1 被添加到值中,因此转换后的值是 UINT_MAX - 19。然后,当您添加 a (6) 的值时,您将得到 UINT_MAX - 13。这个值大于a,所以打印"&gt; a"

如果您将b 设置为-5,则转换后的值为UINT_MAX - 4。向此添加 6 会得到UINT_MAX + 2。由于unsigned int 值的数学运算是以UINT_MAX + 1 为模,实际结果为1。这小于6,因此打印"&lt; a"

另外,这里发生的不是整数提升,而是整数转换。如果表达式中的任何整数类型的等级小于int,则首先进行提升。这里不是这样。

【讨论】:

  • 完美的解释。谢谢!
猜你喜欢
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多