title: Why is unsigned integer overflow defined behavior but signed integer overflow isn't?
body: <p>Unsigned integer overflow is well defined by both the C and C++ standards.  For example, the <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf" rel="noreferrer">C99 standard</a> (<code>§6.2.5/9</code>) states </p>
  
  <blockquote>
    <p>A computation involving unsigned operands can never overﬂow,
    because a result that cannot be represented by the resulting unsigned integer type is
    reduced modulo the number that is one greater than the largest value that can be
    represented by the resulting type.</p>
  </blockquote>
  
  <p>However, both standards state that signed integer overflow is undefined behavior.  Again, from the C99 standard (<code>§3.4.3/1</code>)</p>
  
  <blockquote>
    <p>An example of undeﬁned behavior is the behavior on integer overﬂow</p>
  </blockquote>
  
  <p>Is there an historical or (even better!) a technical reason for this discrepancy?</p>