Re: integer abs() overflow
Jonathan Lee wrote:
On Jul 5, 4:37 pm, Pete Becker <p...@versatilecoding.com> wrote:
No, the code that uses it exhibits the same problem. <g>
Then I misunderstood you. I thought you were suggesting that it would
do the conversion for me. Instead you were suggesting that it would
allow me to detect values that were out of range. I suppose then I
could do
unsigned long my_abs(long a) {
unsigned long c = 0;
long const m = std::numeric_limits<long>::max();
long b = std::abs(a);
while (b < 0) { // move b into range for std::abs()
c += static_cast<unsigned long>(m);
b += m;
b = std::abs(b);
}
c += static_cast<unsigned long>(b);
return c;
}
I guess I would still have to check for c overflowing.
I thought there would be something simpler.
Whoops, I utterly missed your point. Yes, an unsigned type can have a
valid representation for the negation of the smallest negative value,
even if that value can't be represented in the original signed type. I'd
come at it from the other end: check for special cases first.
if (a < -std::numeric_limits<long>::max())
// handle small values
else
// handle normal values
Of course, this assumes that -std::numeric_limits<long>::max() can be
represented as a long.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)