title: What's bad about shifting a 32-bit variable 32 bits?
body: <p>I recently picked up a copy of Applied Cryptography by Bruce Schneier and it's been a good read.  I now understand how several algorithms outlined in the book work, and I'd like to start implementing a few of them in C.</p>
  
  <p>One thing that many of the algorithms have in common is dividing an x-bit key, into several smaller y-bit keys.  For example, Blowfish's key, X, is 64-bits, but you are required to break it up into two 32-bit halves; Xl and Xr.</p>
  
  <p>This is where I'm getting stuck.  I'm fairly decent with C, but I'm not the strongest when it comes to bitwise operators and the like.</p>
  
  <p>After some help on IRC, I managed to come up with these two macros:</p>
  
  <pre><code>#define splitup(a, b, c) {b = a &gt;&gt; 32; c = a &amp; 0xffffffff; }
  #define combine(a, b, c) {a = (c &lt;&lt; 32) | a;}
  </code></pre>
  
  <p>Where a is 64 bits and b and c are 32 bits.  However, the compiler warns me about the fact that I'm shifting a 32 bit variable by 32 bits.</p>
  
  <p>My questions are these:</p>
  
  <ul>
  <li>What's bad about shifting a 32-bit variable 32 bits?  I'm guessing it's undefined, but these macros do seem to be working.</li>
  <li>Also, would you suggest I go about this another way?</li>
  </ul>
  
  <p>As I said, I'm fairly familiar with C, but bitwise operators and the like still give me a headache.</p>
  
  <p><em>EDIT</em></p>
  
  <p>I figured out that my combine macro wasn't actually combining two 32-bit variables, but simply ORing 0 by a, and getting a as a result.<br>
  So, on top of my previous questions, I still don't have a method of combining the two 32-bit variables to get a 64-bit one; a suggestion on how to do it would be appreciated.</p>