The %x format specifier expects an int type, so an implicit cast takes place. Whether char is signed or unsigned in implementation dependent. In this case it is signed, so when it is cast to int, to preserve the sign of the value, sign extension ocurrs, padding the value with leading 1 bits.
A signed value with the MSB set is negative, the sign extension preserves the negativity and the magnitude; so (signed char)0x85 = -123, and (signed int)0xffffff85=-123 also.