Don't like the "A signed char is the same as an ordinary char` part...
n1570 says:
6.2.5#3
"An object declared as type char is large enough to store any member of the basic execution character set. If a member of the basic execution character set is stored in a char object, its value is guaranteed to be nonnegative. If any other character is stored in a char object, the resulting value is implementation-defined but shall be within the range of values that can be represented in that type."
and
6.2.5#15
"[...] The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char"