オーバーフロー、アンダーフローチェック

とりあえず、アンダーフローチェックはやね本2*1に掲載されていたのでこれは完了?と言う事で
オーバーフローについても考えてみようと思う。
・・・相変わらず、IQヒクイナーと思うよ、こんな事でイチイチなやんでいる私。

とりあえずunsigned int 型のオーバーフローは以下のようなやり方でチェックできるんじゃない?と言う事で掲載・・・


//UINT_MAXはunsigned int 型が表現できる最大値
if(UINT_MAX- a1 < a2)
{//over flow

}

unsigned int x = a1 + a2
//注意:このプログラムは間違っています。

多分、これでイイヨウナワルイヨウナ・・・
アレ?

ナに電波なこと書いているんだ・・・ スマン、これは間違い・・・
で、ちょっと考えた結果・・・


template<class T>
struct CheckOverflow{
///a1 + a2をするとき
bool operator()(const T a1,const T a2){
T maxv = std::numeric_limits<T>::max();
T halfv = maxv / 2 ;
T x = a1,y = a2;
if(x < y){
SWAP_NUM(x,y);
}
if(x > halfv + 1){
if(y >= halfv){
return true;
}
}
return false;
}
};

え?if多すぎ?・・・
ゴメン、私の頭だとこれが限界・・・。゜(゜´Д`゜)゜。
公式はあるのでしょうか?
追記:http://d.hatena.ne.jp/bake_3572/20050509/p3に、足し算のオーバーフローアンダーフローチェックのソースコードが書いています。