diff --git a/liboctave/util/oct-inttypes.h b/liboctave/util/oct-inttypes.h --- a/liboctave/util/oct-inttypes.h +++ b/liboctave/util/oct-inttypes.h @@ -667,22 +667,24 @@ public: sub (T x, T y) { #if defined (OCTAVE_HAVE_FAST_INT_OPS) + // The typecasts do nothing, but they are here to prevent an optimizing // compiler from interfering. Also, the signed operations on small types // actually return int. T u = static_cast (x) - static_cast (y); T ux = u ^ x; T uy = u ^ ~y; - if ((ux & uy) < 0) - { - u = (__signbit (~u) - ? octave_int_base::min_val () - : octave_int_base::max_val ()); - } - return u; + + return ((ux & uy) < 0 + ? (u < 0 + ? octave_int_base::max_val () + : octave_int_base::min_val ())); + #else + // We shall carefully avoid anything that may overflow. T u; + if (y < 0) { if (x > octave_int_base::max_val () + y) @@ -703,6 +705,7 @@ public: } return u; + #endif }