That's a known "feature" of most languages that perform modular arithmetic by default, since the negative of Integer.MIN_VALUE is Integer.MIN_VALUE in two's complement arithmetic. Languages that automatically promote to bignums by default (e.g. Lisp) do not suffer from this issue unless modular arithmetic is explicitly requested by the programmer.
I've a C# background and was pretty surprised about that. C# throws an exception in that case.
Re:Java is not a safe language
by lazulicurio on Monday June 13, 2022 @12:32PM
(#31727832)
To be slightly pedantic, C# gives you the option to throw an exception in that case (with either checked blocks or setting the CheckForOverflowUnderflow compiler flag to true), but the default behavior is to allow overflow.
I was under the impression that they compile with /checked per default. TIL!
Regardless of that flag, Math.Abs will throw an OverflowException: https://referencesource.microsoft.com/#mscorlib/system/math....
Re:Java is not a safe language
by lazulicurio on Thursday June 16, 2022 @10:02AM
(#31766160)
The default actually depends on project language IIRC. C# has overflow checking disabled by default, VB.net has it enabled by default. Not sure about F#.
TIL! Thanks!
This one struck me some day because this is why Math.abs can return a negative value. When passing Integer.MIN_VALUE, the result will be -2147483648.
There is now StrictMath.absExact that throws an exception in that case.