On Tue, 12 Apr 2022 at 18:16, pieter@van-schendel.ch via Std-Proposals <std-proposals@lists.isocpp.org> wrote:

In Expressions, Integral conversions, the same formula is given for conversion to unsigned and to signed:

> Otherwise, the result is the unique value of the destination type

> that is congruent to the source integer modulo $2^N$,

> where $N$ is the width of the destination type.

I believe that this cannot be right: it would imply that signed integers of the same width have the same range of positive numbers as unsigned integers, so for signed integrals, a power N-1 should be used, to account for the reduced positive range due to the "sign bit" (if you can use that term for two-s complement).

Suppose you decide to convert 255 to int8_t. There is a unique value of type int8_t congruent to 255 modulo 2^8; that value is -1.

If you then decide to convert -1 to uint8_t; well, again, there is a unique value of type uint8_t congruent to -1 modulo 2^8; that value is 255. (Congruence is an equivalence relation.)

This works because we don't have signed zero (thanks to P0907/P1236 as you note), and so there are 2^N distinct and adjacent values of each signed integer type width N, strictly representing Z_2^N, just as there are 2^N distinct and adjacent values of each unsigned integer type width N.

Hope this helps.