負の整数値の内部表現が2の補数かどうかを調べるメタ関数を作ってみましょう。これは実はそんなに難しくありません。
0 1 2 3 4 5 6 |
template<class T> struct is_2s_complement { static const bool value = (T(-1) & 3) == 3; }; |
-1の下位2ビットを調べてやればすぐに分かります。-1の下位2ビットが11(= 3)であれば2の補数表現です。
C++14以降であれば、次のようにしておけば多少は使い勝手がよくなります。
0 1 2 3 |
template <class T> constexpr bool is_2s_complement_v = is_2s_complement<T>::value; |
ところで、現実には2の補数表現以外の処理系に遭遇する可能性はほとんどありません。こういうのもあるということで参考にしていただければ幸いです。