unsigned long p = 1 << 31;

unsigned long p = 1L << 31;
にしたら同じ値になりました.

ううむ,なぜ
unsigned int j = 1 << 31;
だとうまくいって,longだと1Lにしないとうまくいかんのだ.