The arithmetic types are divided into two categories: integral types (which include character and boolean types) and floating-point types.
The size of—that is, the number of bits in—the arithmetic types varies across machines. The standard guarantees minimum sizes as listed in Table 2.1. However, compilers are allowed to use larger sizes for these types. Because the number of bits varies, the largest (or smallest) value that a type can represent also varies.
The bool
type represents the truth values true
and false
.
There are several character types, most of which exist to support internationalization. The basic character type is char
. A char
is guaranteed to be big enough to hold numeric values corresponding to the characters in the machine’s basic character set. That is, a char
is the same size as a single machine byte.
The remaining character types—wchar_t
, char16_t
, and char32_t
—are used for extended character sets. The wchar_t
type is guaranteed to be large enough to hold any character in the machine’s largest extended character set. The types char16_t
and char32_t
are intended for Unicode characters. (Unicode is a standard for representing characters used in essentially any natural language.)
The remaining integral types represent integer values of (potentially) different sizes. The language guarantees that an int
will be at least as large as short
, a long
at least as large as an int
, and long long
at least as large as long
. The type long long
was introduced by the new standard.
The floating-point types represent single-, double-, and extended-precision values. The standard specifies a minimum number of significant digits. Most compilers provide more precision than the specified minimum. Typically, float
s are represented in one word (32 bits), double
s in two words (64 bits), and long double
s in either three or four words (96 or 128 bits). The float
and double
types typically yield about 7 and 16 significant digits, respectively. The type long double
is often used as a way to accommodate special-purpose floating-point hardware; its precision is more likely to vary from one implementation to another.
Except for bool
and the extended character types, the integral types may be signed or unsigned. A signed type represents negative or positive numbers (including zero); an unsigned type represents only values greater than or equal to zero.
The types int
, short
, long
, and long long
are all signed. We obtain the corresponding unsigned type by adding unsigned
to the type, such as unsigned long
. The type unsigned int
may be abbreviated as unsigned
.
Unlike the other integer types, there are three distinct basic character types: char
, signed char
, and unsigned char
. In particular, char
is not the same type as signed char
. Although there are three character types, there are only two representations: signed and unsigned. The (plain) char
type uses one of these representations. Which of the other two character representations is equivalent to char
depends on the compiler.
In an unsigned type, all the bits represent the value. For example, an 8-bit unsigned char
can hold the values from 0 through 255 inclusive.
The standard does not define how signed types are represented, but does specify that the range should be evenly divided between positive and negative values. Hence, an 8-bit signed char
is guaranteed to be able to hold values from –127 through 127; most modern machines use representations that allow values from –128 through 127.