*This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21
Core Issues List revision 112e.
See http://www.open-std.org/jtc1/sc22/wg21/ for the official
list.*

2023-12-02

#### 610.
Computing the negative of `0U`

**Section: **7.6.2.2 [expr.unary.op]
**Status: **NAD
**Submitter: **comp.std.c++
**Date: **21 December 2006

In 7.6.2.2 [expr.unary.op], part of paragraph 7 describes
how to compute the negative of an unsigned quantity:

The negative of an unsigned quantity is computed by subtracting
its value from 2^{n}, where *n* is the number
of bits in the promoted operand. The type of the result is the
type of the promoted operand.

According to this method, `-0U` will get the value
2^{n} - 0 = 2^{n}, where
*n* is the number of bits in an unsigned int. However,
2^{n} is obviously out of the range of values
representable by an unsigned int and thus not the actual value
of `-0U`. To get the result, a truncating conversion
must be applied.

**Rationale (April, 2007):**

As noted in the issue description, a “truncating
conversion” is needed. This conversion is supplied without
need of an explicit mention, however, by the nature of unsigned
arithmetic given in 6.8.2 [basic.fundamental] paragraph 4:

Unsigned integers, declared `unsigned`, shall obey the laws of
arithmetic modulo 2^{n} where *n* is the number of
bits in the value representation of that particular size of
integer.