[fpc-devel] wrong result for abs(low(int64))

J. Gareth Moreton gareth at moreton-family.com
Thu Apr 4 16:39:53 CEST 2024


Essentially, an arithmetic overflow is happening.  Since the largest 
Int64 possible is 9,223,372,036,853,775,807, going one above that (the 
result to abs(low(int64))) wraps back around to -9,223,372,036,853,775,808.

Internally, you can think about negating (positing?) a negative number 
as inverting the bits and then adding one (aka. two's complement), so 
low(int64) is 1000...000, which inverted becomes 0111...111, and then 
adding one results in 1000...000 again.

Kit

On 04/04/2024 14:14, Martin Frb via fpc-devel wrote:
> The below writes:  -9223372036854775808
>
> Shouldn't absolute return a positive number?
>
> program Project1;
> begin
>   writeln( abs(low(int64)) );
> end.
>
>
>
> Seems
> writeln( abs(low(longint)) );
>
> also returns negative...
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>


More information about the fpc-devel mailing list