2

虽然std::abs(或::abs对于C开发人员)不提升返回值,因此不处理std::numeric_limit<T>::min(),但我希望有一个abs实现,它可以进行更“安全”的处理。

template <typename T>
typename std::make_unsigned<typename std::enable_if<std::is_signed<T>::value, T>::type>::type secure_abs( T value ) {
    if( value >= 0 )
        return value;

    if( value == std::numeric_limits<T>::min() )
        return *reinterpret_cast<typename std::make_unsigned<T>::type*>(&value);

    return -value; //TODO: Prevent promotion to int
}

我还没有弄清楚的事情是如何防止在提升为 int 后出现转换警告(删除减号时)。

有没有更优雅/正确的去除减号的方法?

编辑:

现在对于 INT_MIN 和 2complement 应该是正确的。

4

1 回答 1

0

int由于在使用“等级”低于“等级”的类型的算术运算时,类型提升是不可避免的,int我只看到了两种方法来克服这个警告:

  1. 复杂的。return adder(!value, 1);其中adderfunction 是按位求和器。您可能会发现它是如何在硬件中实现并自己实现的。
  2. 简单的。return static_cast<T>(-value). 由于您没有任何可能导致类型溢出的算术运算,T因此“取消”提升是绝对安全的int
于 2013-02-25T08:24:04.610 回答