PATCH: Bad signed int to long long conversion

Vincent Lefevre vincent at
Fri Feb 10 11:30:05 CET 2012

On 2012-02-09 18:17:17 +0100, Torbjorn Granlund wrote:
> Vincent Lefevre <vincent at> writes:
>   On 2012-02-09 17:01:45 +0100, Torbjorn Granlund wrote:
>   > Strictly speaking, I don't think things like (unsigned long)(MIN_LONG)
>   > is well-defined C.
>   It is well-defined:
> Signed and unsigned integers
>     1   When a value with integer type is converted to another integer
>         type other than _Bool, if the value can be represented by the
>         new type, it is unchanged.
>     2   Otherwise, if the new type is unsigned, the value is converted
>         by repeatedly adding or subtracting one more than the maximum
>         value that can be represented in the new type until the value
>         is in the range of the new type.60)
> Rule 2 surely covers this.  Is this from C99?

This is from (the new) C11, but C99 had the same rule.

> IIRC, this was not well-defined in C89. Am I wrong?

The rationale (for both C89 and C99) says:        Signed and unsigned integers

  Precise rules are now provided for converting to and from unsigned
  integers. On a two's-complement machine, the operation is still
  virtual (no change of representation is required), but the rules
  are now stated independent of representation.

So, there was a change either before or after C89, but if I understand
correctly, machines with a two's-complement are not affected. So, the
number of affected still-used implementations should be close to 0.

Vincent Lefèvre <vincent at> - Web: <>
100% accessible validated (X)HTML - Blog: <>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)

More information about the gmp-bugs mailing list