トリッキーなコード追記

最初のはid:mzp:20060404が解説しているのでそちらを参照。

#define TYPE(type) ((type) -1 > 0 ? (type) -1 : (type) -1 ^ (type) ((type) 1 << (sizeof(type) * CHAR_BIT - 1)))
某スレでこんなのを提示された。
ちゃんと動くよちくしょー。俺のより簡潔だし。
符号判断は一緒、符号のクリアを論理シフトだけで行うにはunsignedに変換しなければならないが、unsigned unsigned等と展開されるとwarningなので、直接unsignedは書けない。
よってunsigned long longを使ったわけだが、そんなことをしなくてもよかった。
符号のクリアに右シフトではなく、
左シフトによるマスク生成とXORによるビットクリアを使っている。
同じようなことはしたけど、そのときはシフト値が大きすぎるってコンパイラに怒られた。
どうもシフト値自体もキャストするのがポイントのようだ。