Imagine this situation. int32_t is an extended integer type and it's represented in two's complement (as the standard required int32_t to be represented). This means that INT32_MIN is -2147483648 ( 0x80000000 ).

Meanwhile int is a standard integer type and it's represented in one's complement (as the standard allows). This means that INT_MIN is -2147483647 .

Now correct me if I'm wrong, but I think both types have the same width, which means, according to 6.3.1.1.1 (emphasis mine):

The rank of any standard integer type shall be greater than the rank of any extended integer type with the same width.

So the rank of int32_t is lower than that of int .

Now 6.3.1.8 (usual arithmetic conversions) says (emphasis mine):

<...> Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands: If both operands have the same type, then no further conversion is needed. Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.

So if understand it correctly, in this code block:

int32_t x = INT32_MIN; int y = 1; x + y; // What happens here?

In the expression x + y , x has to be promoted to int , and INT32_MIN is outside of the range of int .

Is this a bug in the standard or am I missing something?