首页 >后端开发 >C++ >C 如何处理具有不同符号的二元运算符提升?

C 如何处理具有不同符号的二元运算符提升?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-02 08:00:13870浏览

How Does C   Handle Binary Operator Promotion with Differing Signedness?

符号不同时的二元运算符提升

当二元运算符对具有不同符号的操作数进行运算时,C 标准提供了确定提升的具体准则规则和结果类型。

标准第 5/9 节概述了“常用算术适用于此类运算符的转换”。这些转换遵循分层顺序:

  1. 如果任一操作数为 long double,则两个操作数都将转换为 long double。
  2. 如果任一操作数为 double,则两个操作数都将转换为 double。
  3. 如果任一操作数为浮点型,则两个操作数都转换为浮点型。
  4. 积分提升为对两个操作数都执行。
  5. 如果其中一个操作数是 unsigned long,则两个操作数都转换为 unsigned long。
  6. 如果一个操作数是 long int,另一个操作数是 unsigned int,则确定 long int 是否可以表示 unsigned int 的所有值。如果是,则将unsigned int转换为long int;否则,将两个操作数都转换为 unsigned long int。
  7. 如果任一操作数为 long,则两个操作数都将转换为 long。
  8. 如果任一操作数为 unsigned,则两个操作数都将转换为 unsigned。
  9. 否则,两个操作数都保持类型int.

将这些规则应用于提供的代码示例:

示例 1:

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

因为 unsigned int 优先于int 在规则第 5 步中,所有操作数都转换为 unsigned int。因此,结果的类型为 unsigned int。

示例 2:

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

在这种情况下,规则规定两个操作数都应转换为 unsigned int。但是,结果值 (-1) 不能用 unsigned int 表示。因此,表达式的结果类型是根据 §4.7/3 实现定义的。

以上是C 如何处理具有不同符号的二元运算符提升?的详细内容。更多信息请关注PHP中文网其他相关文章!

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