首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C语言中的变量提升

C语言中的变量提升
EN

Stack Overflow用户
提问于 2015-10-02 22:42:16
回答 1查看 1.4K关注 0票数 16

我遇到了一个问题,为什么在这些特定的情况下,输出是不同的。在示例代码a中,正如我所期望的那样,有一个变量提升,结果是> 6,但是在示例代码b中,结果是<= 6

代码语言:javascript
复制
/* **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");

输出:

代码语言:javascript
复制
Code a

> 6

Code b:

<= 6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++?

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32909746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档