Type | Storage size | Value range
--- | --- | ---
char | implementation-defined, usually 1 byte | -2<sup>7</sup> to 2<sup>7</sup>-1 or 0 to 2<sup>8</sup>-1
unsigned char | implementation-defined, usually 1 byte | 0 to 2<sup>8</sup>-1
signed char | implementation-defined, usually 1 byte | -2<sup>7</sup> to 2<sup>7</sup>-1
wchar_t | 2 or 4 bytes | 1 wide character
Notes:
* Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set. A char, a signed char, and an unsigned char occupy the same amount of storage.
* Plain char, signed char, and unsigned char are three distinct types. It is implementation-defined whether a char object can hold negative values.
```
#include <iostream>
#include <type_traits>
int main() {
std::cout<<std::is_signed<char>::value; // 0 or 1
std::cout<<std::is_same<char, signed char>::value; //always 0
std::cout<<std::is_same<char, unsigned char>::value; //always 0
}
```