I had a look at the ABS_CAST macro introduced a while ago, #define ABS_CAST(T,x) ((x) >= 0 ? (T)(x) : -((T)((x) + 1) - 1))
As I understand it, the point is that, e.g., int x; unsigned absx; ... absx = ABS_CAST (unsigned, x); should give the right result for x = INT_MIN (where plain ABS would give the result INT_MIN). And be more portable than the simpler definition #define ABS_CAST(T, x) ((T) ABS(x)) But the current definition seems strange. When x < 0, it will cast the negative value to an unsigned type (which I suspect is not portable according to the C89 spec (maybe it's more well defined in C99?)), and I'm not sure what is gained by the extra +1 and -1 when doing that. I'd suggest using instead #define ABS_CAST(T,x) ((x) >= 0 ? (T)(x) : (((T)(-((x) + 1))) + 1)) Then in the case x < 0, first add 1, and note that both (x+1) and -(x+1) always fit in a signed int. Then negate, cast the resulting *non-negative* number to unsigned, and then an unsigned add of 1 to get the correct absolute value. Am I misunderstanding anything here? Regards, /Niels -- Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26. Internet email is subject to wholesale government surveillance. _______________________________________________ gmp-devel mailing list gmp-devel@gmplib.org http://gmplib.org/mailman/listinfo/gmp-devel