 # Re: [std-proposals] Possibly wrong range for signed integral conversions

From: Edward Catmur <ecatmur_at_[hidden]>
Date: Tue, 12 Apr 2022 23:19:27 +0100
On Tue, 12 Apr 2022 at 18:16, pieter_at_[hidden] via Std-Proposals <
std-proposals_at_[hidden]> 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.