2's complement form is used by C,Because it is the efficeint way to represent positive and negative number in a given bit space.
int i=511; it means i=0000000111111111 in binary(as int takes 16 bits);
when you type cast it in char only 8 bits are saved (as char takes only 8 bits in 2's complement form)
now i =11111111; which is (2^7-1)-2^7=-1;