16

我无法弄清楚为什么在每种特定情况下输出都不同。在示例代码 a 中,正如我所料,有一个变量提升,结果是> 6,但在示例代码 b 中,结果是<= 6

/* **Code a** */
puts("Code a\n");
unsigned int a = 6;
int b = -20;
( a+b > 6) ? puts("> 6\n") : puts("<= 6\n");

/* **Code b** */
puts("Code b:\n");
uint8_t a1 = 6;
int8_t  b1 = -20;  
( a1+b1 > 6) ? puts("> 6\n") : puts("<= 6\n");

输出:

Code a

> 6

Code b:

<= 6
4

1 回答 1

9

通常的算术转换是在加法的操作数上执行的。对于整数类型,如果需要,这包括整数提升,如果两个操作数不具有相同的类型,则进行进一步的转换以将它们转换为通用类型。

在第一种情况下,没有提升,但int操作数被转换为,unsigned int因为int不能保存 的所有可能值unsigned int

在第二种情况下,两个操作数都被提升为int并保持为 an,int因为它们具有共同的类型。

6.5.6 作为参考,加法运算符部分的 C11 标准草案说:

如果两个操作数都具有算术类型,则对它们执行通常的算术转换。

部分6.3.1.8通常的算术转换说:

许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。对于指定的操作数,每个操作数都在不改变类型域的情况下转换为对应的实数类型是公共实数类型的类型。除非另有明确说明,普通实数类型也是 result 对应的实数类型,如果操作数相同,则其类型域为操作数的类型域,否则为复数。这种模式称为通常的算术转换

[...]

否则,对两个操作数都执行整数提升。然后将以下规则应用于提升的操作数

[...]

  • 否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型

[...]

可以在以下问题中找到对此基本原理的一个很好的参考:为什么在 C 和 C++ 中的算术运算之前必须将 short 转换为 int?.

于 2015-10-02T14:56:08.507 回答