As far as I can remember, the C standard still do not
require that
 the computer uses two complement. 
No, but unsigned integer types have to work as if it did.  Signed
integer types may use two's complement, one's complement, or even
sign/magnitude, but nothing else; for example, implementing signed
integers with base -2 is not permitted.  6.2.6.2 in the very late C99
draft I have, notes manually edited in:
       [#2]  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).  If the sign bit  is
       zero,  it shall not affect the resulting value.  If the sign
       bit is one, the value  shall  be  modified  in  one  of  the
       following ways:
         -- the  corresponding  value  with  sign  bit 0 is negated
            (sign and magnitude);
         -- the sign bit has the value -(2N) (two's complement);
(that's -(2^N), mangled by textification)
         -- the sign bit has the value -(2N-1) (one's complement).
(that's -((2^N)-1), mangled by textification)
       Which of these  applies  is  implementation-defined,  as  is
       whether  the  value  with sign bit 1 and all value bits zero
       (for the first two), or with sign bit and all value  bits  1
       (for one's complement), is a trap representation or a normal
       value.   In  the  case  of  sign  and  magnitude  and  one's
       complement,  if  this representation is a normal value it is
       called a negative zero.
...
       [#5]  The  values  of any padding bits are unspecified.45) A
(the "45)" is a footnote reference)
       valid (non-trap) object representation of a  signed  integer
       type   where  the  sign  bit  is  zero  is  a  valid  object
       representation of the corresponding unsigned type, and shall
       represent the same value.
/~\ The ASCII                             Mouse
\ / Ribbon Campaign
 X  Against HTML                mouse at 
rodents-montreal.org
/ \ Email!           7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B