char!=(signed char), char!=(unsigned char)
While most integral types like short
and int
default to being signed
, char
does not have a default signage in C++.
It is neither the type signed char
nor unsigned char
, so implementations may decide whether it is signed.
It's a common mistake that C++ programmers run into when they use char
as an 8 bit integer type.
Here is your answer from the standard:
3.9.1 Fundamental types [basic.fundamental]
Objects declared as characters (
char
) shall be large enough to store any member of the implementation's basic character set. If a character from this set is stored in a character object, the integral value of that character object is equal to the value of the single character literal form of that character. It is implementation-defined whether achar
object can hold negative values. Characters can be explicitly declaredunsigned
orsigned
. Plainchar
,signed char
, andunsigned char
are three distinct types. Achar
, asigned char
, and anunsigned char
occupy the same amount of storage and have the same alignment requirements (basic.types); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types. In any particular implementation, a plainchar
object can take on either the same values as asigned char
or anunsigned char
; which one is implementation-defined.