首页 >后端开发 >C++ >C 提升规则如何确定混合有符号和无符号整数类型的二元算术运算符的返回类型?

C 提升规则如何确定混合有符号和无符号整数类型的二元算术运算符的返回类型?

Patricia Arquette
Patricia Arquette原创
2024-11-28 08:30:11833浏览

How Do C   Promotion Rules Determine the Return Type of Binary Arithmetic Operators with Mixed Signed and Unsigned Integer Types?

提升规则如何管理具有混合符号类型的二元运算符算术

考虑以下代码:

int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;

运算符计算结果为 2147483648,建议使用 unsigned int返回类型。相反,在以下代码中:

unsigned int us = 42;
int neg = -43;
int result = us + neg;

result 为 -1,表示 int 返回类型。

促销规则解析

C标准定义了算术二元运算符(C §5/9):

  1. 如果任一操作数为 long double,则将两者都转换为 long double。
  2. 如果任一操作数为 double,则将两者都转换为 double。
  3. 如果任一操作数为浮点型,则将两者都转换为浮点型。
  4. 对两者应用积分提升
  5. 如果其中一个操作数为 unsigned long,则将两者都转换为 unsigned long。
  6. 如果其中一个操作数为 long int,另一个为 unsigned int,则尽可能将 unsigned int 转换为 long int,否则将两者都转换为 unsigned long int。
  7. 如果任一操作数为 long,则将两者都转换为long。
  8. 如果其中一个操作数是无符号的,则将两者都转换为无符号。
  9. 如果两个操作数都是 int,则不会发生进一步的转换。

的含义示例

在这两个示例中,提升规则都会生成无符号类型

示例 1: max 和 1 都提升为 unsigned int,导致返回类型为 unsigned int。

示例 2: 提升规则并没有规定 int 和 unsigned int 之间明显的胜者。但是,选择了无符号类型,导致结果无符号溢出。由于结果最终分配给 int,因此根据 C §4.7/3,结果值是未定义的。

以上是C 提升规则如何确定混合有符号和无符号整数类型的二元算术运算符的返回类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn