abs and minimum values

Ali Çehreli acehreli at yahoo.com
Fri Oct 29 14:20:09 UTC 2021

On 10/29/21 1:05 AM, Dom DiSc wrote:

 > I recommend to implement your own abs function this way (was not
 > accepted for phobos, as it now does NOT return the same type as the
 > argument, which was considered a "breaking change" :-( ):

Combined with automatic type conversions we got from C, it can cause 
unexpected results as well. One might expect the following program to 
print -1 when that definition of abs() is used in an expression:

import std.traits;
import std.stdio;

/// get the absolute value of x as unsigned type. always succeeds, even 
for T.min
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.


More information about the Digitalmars-d-learn mailing list