c++ - 为什么 std::abs 返回有符号类型

标签 c++ unsigned signed gcc-warning absolute-value

当我将 std::abs(int)unsigned 进行比较时,我收到了有关有符号与无符号比较的警告。事实上,std::abs 返回有符号值。为什么会做出这样的选择?它本来可以解决负值的绝对值不能用有符号类型表示的问题。

然后,有没有比这更干净(即没有类型转换)的东西来避免警告?

#include <cassert>
#include <cstdlib>

// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
  return
    (0 < rhs || static_cast<unsigned>(-rhs) < lhs
     ? rhs + lhs
     : 1);
}

int main()
{
  assert(add(42, -41) == 1);
  assert(add(42, 0) == 43);
  assert(add(42, 1) == 43);
  assert(add(42, -51) == 1);
}

最佳答案

简短的回答是这样做是为了使 abs 的返回类型与其输入类型相同。大多数时候,这正是您想要的。

大多数情况下,在调用 abs 时,您正在处理一个所有元素都属于同一类型的方程式(或者您会收到警告),并且您希望在该方程式中使用某个变量的大小。这并不意味着您要更改方程式中某个变量的类型。这会给出你提到的那种问题/警告。

因此,简而言之,在要求有符号变量的绝对值时,想要相同的输入和输出类型更为常见和自然。值的大小不常用作指标。

关于c++ - 为什么 std::abs 返回有符号类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16101062/

相关文章:

C++ vector 下标超出范围错误 1221

c++ - 如果我删除 C++ 程序正在向其写入数据的文件,会发生什么情况?

c++ - 递归反转数组

c - 指向无符号整数的无符号字符

c++ - 使用 typedef'd uint 会导致错误,而 "unsigned int"不会...?

c - C标准是否对INT_MIN和INT_MAX之间的关系做出保证?

c++ - Opencv绘制等高线

c - 了解 C 中的 unsigned char 左旋转

php - 为什么 1++ + 1 在 php 中计算结果为 2?

c# - 为什么要对 String.Length 进行签名?