2

std::abs(またはC::abs開発者の場合)戻り値を昇格させないため、 handle を処理しませんが、より「安全な」処理を行う実装が必要です。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ため、この警告を克服する方法は2つしかありません。

  1. 複雑。return adder(!value, 1);ここで、adder関数はビット単位の総和です。ハードウェアでの実装方法を見つけて、自分で実装することができます。
  2. 単純。return static_cast<T>(-value). 型のオーバーフローを引き起こす可能性のある算術演算がないため、T昇格を「キャンセル」しても安全です。int
于 2013-02-25T08:24:04.610 に答える