aki*_*kim 12 c++ unsigned signed gcc-warning
当我比较一个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);
}
Run Code Online (Sandbox Code Playgroud)
    简短的回答是,这样做是为了使返回类型abs与其输入类型相同.这正是你想要的,大多数时候.
大多数情况下,当调用abs时,你正在处理一个方程式,其中所有元素都是相同的类型(或者你会得到警告),并且你想要使用该等式中某个变量的大小.这并不意味着您想要更改等式中某个变量的类型.这会给你提到的那种问题/警告.
因此,简而言之,在要求签名变量的绝对值时,想要相同的输入和输出类型更为常见和更自然.价值的大小通常不被用作指数.