Hi,
On 2018-09-27 17:34:54 -0700, Andres Freund wrote:
> On 2018-09-27 20:18:12 -0400, Tom Lane wrote:
> > > /* Handle +/- */
> > > if (dosign && adjust_sign((value < 0), forcesign, &signvalue);
> > > uvalue = -(uint64) value;
> > > else
> > > uvalue = (uint64) value;
> >
> > Hm, what does -x mean for an unsigned value? I'm not really
> > convinced this is conceptually better.
>
> 6.2.5 (9): "... A computation involving unsigned operands can never
> 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 type."
>
> (unsigned)((int)-1) == 4294967295
> -(unsigned)4294967295 == 1
>
> I think that's well defined.
I guess some might consider
uvalue = (uint64) 0 - (uint64) value
to be easier to reason about?
Greetings,
Andres Freund