title: Is it theoretically possible for an implementation to promote an unsigned int to an int?
body: <p>According to the following two clauses from the C99 standard:</p>
  
  <blockquote>
    <p><strong>6.2.5-9</strong></p>
    
    <p>The range of nonnegative values of a signed integer type is a subrange
    of the corresponding unsigned integer type, and the representation of
    the same value in each type is the same.</p>
    
    <p><strong>6.2.6.2-2</strong></p>
    
    <p>For signed integer types, the bits of the object representation shall
    be divided into three groups: value bits, padding bits, and the sign
    bit. There need not be any padding bits; there shall be exactly one
    sign bit. Each bit that is a value bit shall have the same value as
    the same bit in the object representation of the corresponding
    unsigned type (if there are M value bits in the signed type and N in
    the unsigned type, then M ≤ N ).</p>
  </blockquote>
  
  <p>It is (probably) possible for a signed type to represent all numbers representable by the corresponding unsigned type. For example, if the <code>unsigned int</code> type is represented using 31 value bits and 1 padding bit and the signed int is represented using 31 value bits and no padding bits.</p>
  
  <p>Is an implementation allowed to do so? If yes, does that mean that an <code>unsigned int</code> will be promoted to an <code>int</code> in such a case (since both types have the same conversion rank and <code>int</code> can represent all values that <code>unsigned int</code> represents)?</p>