For every integer-class type I,
let B(I) be a hypothetical extended integer type
of the same signedness with the smallest width ([basic.fundamental])
capable of representing the same range of values.
Let a and b be objects of integer-class type I,
let x and y be objects of type B(I) as described above
that represent the same values as a and b respectively, and
let c be an lvalue of any integral type.
For every unary operator @ for which the expression @x
is well-formed, @a shall also be well-formed
and have the same value, effects, and value category as @x
provided that value is representable by I.
If @x has type bool, so too does @a;
if @x has type B(I), then @a has type I.
For every assignment operator @=
for which c @= x is well-formed,
c @= a shall also be well-formed and
shall have the same value and effects as c @= x.
The expression c @= a shall be an lvalue referring to c.
For every binary operator @ for which x @ y is well-formed,
a @ b shall also be well-formed and
shall have the same value, effects, and value category as x @ y
provided that value is representable by I.
If x @ y has type bool, so too does a @ b;
if x @ y has type B(I), then a @ b has type I.
numeric_limits<I>::min() and numeric_limits<I>::max() return
the lowest and highest representable values of I, respectively, and
numeric_limits<I>::lowest() returns numeric_limits<I>::min().
Recommended practice: The implementaton of an algorithm on a weakly incrementable type
should never attempt to pass through the same incrementable value twice;
such an algorithm should be a single-pass algorithm.