Any C implementation that insists on having the high bit set for normal character (char)s should also treat (char) as (unsigned char), or else there will be sign-propagation constants when (char)s are widened to (int). Otherwise, this is a permissible (although unusual) implementation choice.