On Mon, Nov 30, 2009 at 1:54 PM, me22 <me22.ca@xxxxxxxxx> wrote: > 2009/11/30 Florian Weimer <fw@xxxxxxxxxxxxx>: >> >>> On Sun, Nov 29, 2009 at 9:00 PM, me22 <me22.ca@xxxxxxxxx> wrote: >>>> What about using (long)((unsigned long)a + (unsigned long)b) or >>>> something to get around the UB? >> >> You'd also have to compare against (1 << (sizeof(long) * CHAR_BITS - >> 1)) instead of 0, pessimizing the code somewhat. >> > > Why? If numbers are 2s-complement, the cast back to a signed type is > well-defined, isn't it? In practice, yes, I think so. In theory, no: the result of the conversion is implementation defined for numbers outside the range of the signed type. (C99 6.3.1.3). But I'd be surprised if any implementation on a two's complement machine does anything other than just preserve the bit pattern, as you'd expect. Mark