title: Are long-suffix and unsigned-suffix needed when declaring long literals in C++?
body: <p>I have some ancient memories of writing C code like:</p>
  
  <pre><code>long value = 0;
  </code></pre>
  
  <p>in the bad old Win16 days and ending up with <code>value</code> being only half-initialized: i.e. the lower 16 bits were <code>0</code> and the upper 16 bits were whatever random bits were at that location in memory. As such, I became conditioned to write:</p>
  
  <pre><code>long value = 0L;
  </code></pre>
  
  <p>Is this still required in this day-and-age under C99 and/or C++? I know that ILP32 specifies that <code>int</code> and <code>long</code> are both 32-bit, but suppose we're using, say, LP64 where <code>int</code>s are 32-bits and <code>long</code>s are 64-bits. Are the suffixes required or will the modern forms of C and C++ implicitly extend literals to the length of the variable they're being assigned to?</p>
  
  <p>How about unsigned values? I.e. is this required?</p>
  
  <pre><code>unsigned long value = 0UL;
  </code></pre>