The operand of the unary minus first undergoes standard promitions, so it is of type int
, which can represent the value -128
. The result of the operation is the value 128
, also of type int
. The conversion from int
to signed char
, being a narrowing of signed types, is implementation-defined.
(Your implementation seems to do a simple wrap-around: 125, 126, 127, -128, -127, ...)