A narrow type is a C integer type that cannot be used directly in arithmetic. Before an arithmetic expression is evaluated, a narrow integer is promoted to a wider type; on realistic platforms, that type is signed int with the same value, even when the original type was unsigned. section 5.2
The prominent narrow integer types are char and bool. char handles printable characters, while bool holds false and true; C nevertheless treats both as numeric values. The standard constrains, rather than fully specifies, the precision and ranges of the underlying types, so implementations can differ. section 5.2
Table 5.1 Base types according to the four main type classes. Types with a gray background don’t allow for arithmetic; they are promoted before doing arithmetic. Type char is special since it can behave like unsigned or signed, depending on the platform. All types in this table are considered to be distinct types, even if they have the same class and precision.
| Class | Systematic name | Other name | Rank | |
|---|---|---|---|---|
| Integers | Unsigned | bool | _Bool | 0 |
unsigned char | 1 | |||
unsigned short | 2 | |||
unsigned int | unsigned | 3 | ||
unsigned long | 4 | |||
unsigned long long | 5 | |||
| [Un]signed | char | 1 | ||
| Signed | signed char | 1 | ||
signed short | short | 2 | ||
signed int | signed or int | 3 | ||
signed long | long | 4 | ||
signed long long | long long | 5 | ||
| Floating point | Real | float | ||
double | ||||
long double | ||||
| Complex | float _Complex | float complex | ||
double _Complex | double complex | |||
long double _Complex | long double complex | |||
Use the base-type table to identify which C types are narrow and therefore promoted before arithmetic; it also highlights char's platform-dependent signedness. section 5.2

