title: bit shifting with unsigned long type produces wrong results
body: <p>I'm a bit confused because I wanted to initialize a variable of type <code>unsigned long</code> whose size is 8 bytes on my system (on every modern system I suppose). When I want to assign <code>1 &lt;&lt; 63</code> to the variable, I get a compiler warning however and the number is in fact 0. When I do <code>1 &lt;&lt; 30</code> I get the expected result of <code>2 ^ 30 = 1073741824</code>. Yet when I do <code>1 &lt;&lt; 31</code>, I get the result of <code>2 ^ 64</code> (I think; actually this shouldn't be possible) which prints <code>18446744071562067968</code>. </p>
  
  <p>Can anyone explain this behaviour to me?</p>