abs and minimum values

Dom DiSc dominikus at scherkl.de
Sun Oct 31 05:04:33 UTC 2021


On Friday, 29 October 2021 at 14:20:09 UTC, Ali Çehreli wrote:
> Unsigned!T abs(T)(const(T) x) if(isIntegral!T)
> {
>    static if(isSigned!T) if(x < 0) return cast(Unsigned!T)-x;
>    return x;
> }
>
> void main() {
>   int a = -5;
>   int b = -4;
>   writeln(a + abs(b)); // -5 + 4 == -1? (No!)
> }
>
> The program prints uint.max.

This should be no surprise. You need to know what the resulting 
type of int + uint should be. And it is ...... uint!  which is 
one of the stupit integer-promotion rules inherited from C. I 
just don't understand how "promoting" something by dropping some 
important information (the sign) and on the fly also destroying 
the absolute value can ever be a good choice. I always thought it 
should be the other way round.
The way it is is like "promoting" int + float to int (by 
discarding the fraction part and possibly too high exponents). 
And those two types are also of same size, so this is not an 
argument.
Promotion should always be in a direction where it at least 
sometimes can be correct.


More information about the Digitalmars-d-learn mailing list