Pourquoi renvoyer 0x80000000 à partir d’une fonction qui retourne int32_t ne provoque-t-il pas un avertissement?

Considérer:

int32_t f() { return 0x80000000; } 

Pourquoi cela ne provoque-t-il pas un avertissement du compilateur (au moins sur GCC)? 0x80000000 est en dehors de la plage de int32_t ( INT32_MAX est 0x7fffffff ). Je crois que cela devrait provoquer une dissortingbution implicite – est-ce correct?

Autre consder:

 if (f() == 0x80000000) foo(); 

Ce qui précède ne provoque aucun avertissement sur GCC. toutefois

 int32 ret = f(); if (ret == 0x80000000) baz(); 

Causes “warning: comparaison entre expressions entières signées et non signées”. Je crois que c’est parce que 0x80000000 a le type unsigned int parce qu’il est hors de la plage de int . Est-ce exact?

En supposant qu’aucune de mes hypothèses ne soit fausse, pourquoi la première comparaison ne provoque-t-elle pas un avertissement?

    Le commutateur d’avertissement approprié semble être -Wconversion , qui n’est pas activé par -Wextra .

    Je crois que c’est parce que 0x80000000 a le type unsigned int en raison d’être hors de la plage de int. Est-ce exact?

    Oui, puisqu’il s’agit d’un littéral entier hexadécimal, son type serait le plus étroit de ces types capable de représenter la valeur du littéral:

    • int
    • unsigned int
    • long
    • unsigned long
    • long long
    • unsigned long long