Well, I am not an expert on this, but the key is what the C standard means by "machine's standard printing set". On most modern machines/systems this will be 7-bit ASCII. So as long as you assign just characters of that range to a
char variable, you can be sure that, when interpreted as an integer, you get a positive value.
The (full) printing set of a machine may contain a lot more characters, but when you, for example, assign an umlaut like ä, ö or ü to a character variable, you have to expect on some machines the integer conversion of that variable becoming <0, on others >0, this is not defined in the standard. Furthermore, there is no guarantee that such a character will always be printed as the same letter, this may, for example, depend on the activate codepage or the environment of the program.