any particular implementation, a plain char object can take on
either the same values as a signed char or an unsigned
char; which one is implementation-defined.
For each value i of type unsigned char in the range
0 to 255 inclusive, there exists a value j of type
char such that the result of an integral
conversion from i to char is
j, and the result of an integral conversion from
j to unsigned char is i.
For each of the standard signed integer types,
there exists a corresponding (but different)
standard unsigned integer type:
“unsigned char”, “unsigned short int”,
“unsigned int”, “unsigned long int”, and
“unsigned long long int”, each of
which occupies the same amount of storage and has the same alignment
requirements as the corresponding signed integer
that is, each signed integer type has the same object representation as
its corresponding unsigned integer type.
Likewise, for each of the extended signed integer types there exists a
extended unsigned integer type with the same amount of storage and alignment
The range of non-negative
values of a signed integer type is
a subrange of the corresponding unsigned integer type,
the representation of the same value in each of the two types is the same, and
the value representation of each corresponding signed/unsigned type shall be the same.
The standard signed integer types and standard unsigned integer types
are collectively called the standard integer types, and the extended
signed integer types and extended
unsigned integer types are collectively called the
extended integer types.
The signed and unsigned integer types shall satisfy
the constraints given in the C standard, section 18.104.22.168.1.
An expression of type cvvoid shall
be used only as an expression statement, as an operand
of a comma expression, as a second or third operand
of ?: ([expr.cond]), as the operand of
typeid, noexcept, or decltype, as
the expression in a return statement for a function
with the return type cvvoid, or as the operand of an explicit conversion
to type cvvoid.
This implies that
unsigned arithmetic does not overflow because a result
that cannot be represented by the resulting unsigned integer type is
reduced modulo the number that is one greater than the largest value
that can be represented by the resulting unsigned integer type.
representation for integers that uses the binary digits 0
and 1, in which the values represented by successive bits are additive,
begin with 1, and are multiplied by successive integral power of 2,
except perhaps for the bit with the highest position.
(Adapted from the
American National Dictionary for Information Processing Systems.)