>>222
こんな感じの文を書いてる。

unsigned char *p;
unsigned long a;
    :
a |= *p >> (32 - s); // 0 <= s <= 32

s=1〜32のときは期待通り動くのが、s=0のときだけ0にならず驚いた。

>>223
こんな夜中にレスつけてくれただけでも有難う。

いろいろ検索してるうちにこの症状について書いてあるページを見つけた。
どうやらこれは処理系依存らしいが、ANSI Cでもそう定められてるのだろうか。
ttp://www.biwa.ne.jp/~chu0296/laboratory/cpp.html