Les règles pour les types de constantes décimales entières ont changé entre les éditions 1990 et 1999 de la norme ISO C.
Dans la version 1990, un type de constante de nombre entier décimal unsuffixed est le premier de int
, long int
ou unsigned long int
dans laquelle sa valeur peut être représentée. (C90 n'avait pas de type long long
ou unsigned long long
).
Dans les versions 1999 et 2011, son type est l'un des suivants: int
, long int
, long long int
; ce n'est jamais de type non signé.
Le type d'une constante particulière (telle que 2147483648
) varie en fonction des plages de types entiers du compilateur que vous utilisez. Si le type long
du compilateur se trouve être 32 bits, 2147483648
sera de type unsigned long
si votre compilateur utilise les règles C90, ou de type long long
s'il utilise les règles C11 (long long
est garanti à au moins 64 bits). Le compilateur vous avertit à ce sujet.
Vous pouvez ajouter des suffixes pour spécifier le type d'une constante - mais il n'y a pas de suffixe pour la signature standard int
. Vous pouvez ajouter U
pour unsigned int
, L
pour long
, UL
pour unsigned long, et ainsi de suite.
Il est important de garder à l'esprit que -2147483648
est et non une constante entière; plutôt 2147483648
par lui-même est une constante entière et -2147483648
est une expression qui applique un opérateur moins unaire à cette constante.En vertu des règles C90, si la constante est de type unsigned long
, il s'agit d'un nombre unaire non signé non signé, qui, selon les règles de l'arithmétique non signée, donne la valeur 2147483648
. Sous les règles C99 ou C11, 2147483648
est susceptible d'être de type (signé) long long
, et de le renoncer il donne -2147483648
, également de type long long
.
Vous verrez parfois du code qui utilise (-2147483647 - 1)
pour éviter ce problème; étant donné un int
32 bits, 2147483647
est de type int
et le résultat de l'expression donne la valeur attendue int
sans débordement.
Bien sûr, si votre compilateur a des tailles différentes pour les types entiers, cela peut devenir encore plus compliqué.
C90 n'a pas le type 'long long', ce qui explique pourquoi il traite ces nombres différemment de C99. – Lindydancer
FYI: La bonne réponse est trouvée ici: http://stackoverflow.com/questions/2347936/cant-get-rid-of-this-decimal-constant--unsigned-only-in-iso-c90- avertissement – natersoz