On Wednesday, 6 November 2024 at 00:00:48 UTC, Dennis wrote:

That's right, it only removes the deprecation that requires a double cast to fix, but you still need an explicit cast to truncate the result of `-s` (which got promoted to `int`) back to a `short`, unless the compiler can prove at compile time it will always fit in 16 bits. This analysis is called Value Range Propagation (VRP) in the specification: You can also use an assignment operator, which allows overflow without explicit cast:

s *= -1;

Thank you! *= it is, then. I guess the oddity is actually that the negation of a long is a long, an int--int. But short and byte -> int. All of them have a value which won't fit in the type when negated. I don't mind much, as I have no plans to do a lot of math on short. But you may get visited by the 8- and 16-bit Mafia at some point! :-)

Andy

    long l = -5;
    l = -l;
    writeln(l);

    int i = -5;
    i = -i;
    writeln(i);

    short s = -5;
    s = -s;
    writeln(s);

    byte b = -5;
    b = -b;
    writeln(b);

Reply via email to