促进abs实施的类型

Type promoting abs implemention

本文关键字:类型 abs 促进      更新时间:2023-10-16

虽然std::abs(或用于Cdevs的::abs(不提升返回值,因此不处理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和2完成应该是正确的。

由于对"rank"低于int的类型使用算术运算时,类型升级到int是不可避免的,因此我只能看到两种方法来克服此警告:

  1. 复杂。return adder(!value, 1);,其中adder函数是逐位求和器。您可能会发现它是如何在硬件和自己实现一个
  2. 很简单。return static_cast<T>(-value)。由于您没有任何可能导致类型T溢出的算术运算,因此"取消"升级到int是绝对安全的