”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 普通算术转换如何确定带符号和无符号操作数的二元“+”运算符的结果类型?

普通算术转换如何确定带符号和无符号操作数的二元“+”运算符的结果类型?

发布于2024-12-22
浏览:431

How Do Usual Arithmetic Conversions Determine the Result Type of Binary \

有符号和无符号二元运算符的提升规则

考虑以下代码片段:

// Snippet 1
int max = std::numeric_limits::max();
unsigned int one = 1;
unsigned int result = max   one;
// Snippet 2
unsigned int us = 42;
int neg = -43;
int result = us   neg;

在这些情况下,考虑到操作数的不同符号,“ ”运算符如何确定正确的结果类型?

该运算符遵循“通常的算术转换”规则,它根据操作数类型规定类型转换步骤。根据此规则,如果任一操作数为:

  • long double,则两个操作数都转换为 long double。
  • double,两个操作数都转换为 double。
  • float,两个操作数都转换为 float。
  • unsigned long,另一个操作数转换为 unsigned long.
  • long int 和另一个操作数 unsigned int,如果 unsigned int 的值可以用 long int 表示,则两个操作数都转换为 unsigned long int;否则,两者都转换为 long。
  • long,另一个操作数转换为 long。
  • unsigned,另一个操作数转换为 unsigned。

Since int 和 unsigned int 在规则中是可以互换的,选择具有更宽类型(unsigned int)的操作数作为结果类型。

这解释了为什么代码段 1 中,结果是 unsigned int (2147483648),而在代码段 2 中,结果是 int (-1)。有符号操作数 (neg) 隐式转换为无符号 int,在后一种情况下会产生未定义的值。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3