Joe Buck <[EMAIL PROTECTED]> writes:

>> >       *hv = (HOST_WIDE_INT) -(unsigned HOST_WIDE_INT) h1;
>> 
>> Can't that conversion overflow?
>
> Not on a two's complement machine,

Sure it can.  Suppose we have a 64-bit two's complement
machine with no padding, and h1 is - 2**63.  Then (unsigned
HOST_WIDE_INT) h1 is 2**63, -(unsigned HOST_WIDE_INT) h1 is
also 2**63, and converting 2**63 to HOST_WIDE_INT overflows.

In this case C99 says the overflow results in an
implementation-defined value, or an implementation-defined
signal.  If the former, the most plausible value is - 2**63
but C99 allows other values.  If the latter, GCC will crash.
Either way, the code is "broken" -- unless you assume wrapv
semantics of course.

Even an expert like you can easily get this wrong, and this
suggests how tricky this area of Standard C really is.  Only
a tiny fraction of C programmers know how to write this sort
of code reliably and in conformance to minimal standard C.
It's little wonder that most C programmers assume wrapv
semantics in cases like this.

Reply via email to