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