I was reading in the C99 standard about the usual arithmetic conversions.
If both operands have the same type, then no further conversion is needed.
It is converted to unsigned, the unsigned arithmetic just happens to give the result you see. The result of unsigned arithmetic is equivalent to doing signed arithmetic with two's complement and no out of range exception.
unsigned