unsigned char c = 0xff;
>c <<= 7; => 0x80
>c <<= 8; => 0

unsigned short s = 0xffff;
>s <<= 15; =>0x8000
>s <<= 16; => 0

unsigned long l = 0xffffffff;
>l <<= 31; => 0x80000000
>l <<= 32; => 0xffffffff;

vc6を利用して上の様な結果になるのですが、
となるのですが、longの時の32bit左シフトだけ例外的な動作になって困ってます。
処理系依存な動作であることは承知してますが、
どうにか分岐をせずに l<<32 が 0 になるようなアルゴリズム無いでしょうか?