我遇到了一个问题,为什么在这些特定的情况下,输出是不同的。在示例代码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
发布于 2015-10-02 22:56:09
通常的算术转换是在加法操作数上执行的。对于整数类型,这包括整数提升(如果需要),如果两个操作数不具有相同的类型,则执行进一步的转换以将它们转换为公共类型。
在第一种情况下,没有提升,但int
操作数被转换为unsigned int
,因为int
不能保存unsigned int
的所有可能值。
在第二种情况下,两个操作数都被提升为int
,并保留为int
,因为它们具有共同的类型。
作为参考,6.5.6
加法运算符部分的C11标准草案说:
如果两个操作数都是算术类型,则对它们执行通常的算术转换。
6.3.1.8
节通常算术转换是这样说的:
许多期望算术类型的操作数的运算符会导致转换,并以类似的方式生成结果类型。的目的是为操作数和结果确定一个通用的实数类型。对于指定的操作数,在不更改类型域的情况下,将每个操作数转换为其对应的实数类型为普通实数类型的类型。除非另有明确说明,否则普通实数类型也是结果的相应实数类型,如果它们相同,则其类型域为操作数的类型域,否则为复杂类型。这种模式称为通常的算术转换。
..。
否则,将在两个操作数上执行整数提升。则将以下规则应用于升级的操作数
..。
..。
可以在下面的问题中找到一个很好的参考资料,了解其基本原理:Why must a short be converted to an int before arithmetic operations in C and C++?。
https://stackoverflow.com/questions/32909746
复制相似问题