TITLE: signed versus unsigned characters (Newsgroup: comp.lang.c++.moderated, 12 Aug 99) ROBERTSON: "Keith Robertson" > Is there any reason why you might want to choose an unsigned char >over a plain old char in C++? Note: I have seen this done in code that >will be a part of an embedded system. CLAMAGE: Steve Clamage The types char, signed char, and unsigned char are always distinct, even though they have the same number of bits, and type char has the same representation and behavior as either signed char or unsigned char. By analogy, it is common for types int and long to have the same representation, although they are always distinct types. If you want a small unsigned integer object capable of representing unsigned values in the range 0-255, use unsigned char. Type "plain" char need not behave as an unsigned type. If you use the value of these integers in expressions, you must understand the rules for mixed-mode arithmetic. When some of the operands in an expression are signed and some are unsigned, you have to pay close attention to the rules to get the results you want. Such code tends to be fragile. Consider whether a signed short or int would be better overall than an unsigned char. (A signed short must also be capable of representing values in the range 0-255). OTOH, if you are using bitwise operations on the values, e.g. shifting and masking, you probably do want an unsigned type. The rules of arithmetic and bit operations on unsigned types are completely defined. Some aspects of arithmetic and bit operations on signed types depend on the implementation. If you want to store characters (as opposed to small positive integers), use "plain" char. That type will have the correct behavior for all character-oriented classes and functions, whereas type unsigned char (or signed char) will not always work. If you want to do arithmetic on characters, you don't have many really good choices. You should ordinarily use type "plain" char, but since it can behave as either a signed or unsigned value, some operations might not behave as you want unless you use casts or assigment to "larger" integer types to force specific behavior. But some arithmetic operations are completely defined for type char. For example, all the 96 characters in the basic character set must have a non-negative representation, even if type char is signed. The values of the integer characters '0' through '9' must be contiguous in ascending order, meaning '1'+2 always has the same value as '3'.