http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60843
Bug ID: 60843 Summary: Documentation: 4.5 Integers/C99 6.3.1.3 ("reduce modulo 2^N") Product: gcc Version: 4.8.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: other Assignee: unassigned at gcc dot gnu.org Reporter: kdevel at vogtner dot de Section 4.5 states [1]: "The result of, or the signal raised by, converting an integer to a signed integer type when the value cannot be represented in an object of that type (C90 6.2.1.2, C99 6.3.1.3). For conversion to a type of width N, the value is reduced modulo 2^N to be within range of the type; no signal is raised." Reduce A modulo M usually means find the least integer R in the range [0, M - 1] such that A is congruent R modulo M. But this is not what gcc compiled programs do on i686/x86_64: One finds e.g. (int) 2147483649u == -2147483647. The original bits are taken "as is", which equivalents to *subtraction* of 2^N (N=32) giving -2147483647. [1] http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Integers-implementation.html