sizeof
renvoie un entier non signé, donc TOTAL_ELEMENTS
est également signée.
d
est signé. D'abord, d
est -1
. Cependant, lorsque l'on fait la comparaison, d
est implicitement transtypage non signé, donc il n'est plus -1
lorsque comparé TOTAL_ELEMENTS
, il est en fait UINT_MAX
(ce qui est 4294967295
sur ma machine, mais peuvent différer pour les autres).
Aussi,
Si vous voulez résoudre ce problème, catalogué TOTAL_ELEMENTS
de int
:
for(d = -1; d <= (int)(TOTAL_ELEMENTS - 2); d++)
Ce sera d'impression:
23
34
12
17
204
99
16
Comme vous pouvez vous attendre. Vous pouvez également regarder opération de Comparaison sur non signés et les entiers signés pour plus d'information sur le thème de " signé non signé comparaisons.
Il est intéressant de noter que le tournage sur les avertissements du compilateur serait avez vous a aidé à comprendre ce qui se passe (comme observé par hyde dans son commentaire):
$ gcc -Wall -Wextra test.c
test.c:7:17: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]
for(d = 0; d < TOTAL_ELEMENTS; d++)
~ ^ ~~~~~~~~~~~~~~
1 warning generated.
Sinon, pourquoi ne pas commencer d
à 0
et exécuter d' TOTAL_ELEMENTS - 1
à la place? Vous pouvez même laisser tomber le transtypage, qui est nécessaire seulement pour le cas de coin de d = -1
.
for(d = 0; d < TOTAL_ELEMENTS; d++)
printf("%d\n", array[d]);
Comme une note de bas de page, voici les Standard C99 extraits:
-
6.3.1.8p2 définit la conversion d'une signature de type non signé.
Si l'opérande qui a unsigned integer a rang supérieur ou égal au rang de la catégorie de l'autre opérande, puis
l'opérande de type entier signé est converti dans le type de la
opérande de type entier non signé.
-
6.3.1.3p2 définit la façon dont la conversion est faite: Par l'ajout d' UINT_MAX + 1
à la signature de la représentation.
Si le nouveau type est non signé, la valeur est convertie à plusieurs reprises par l'ajout ou la soustraction d'une plus de la valeur maximale
qui peut être représenté dans le nouveau type jusqu'à ce que la valeur est dans l'
la gamme du nouveau type.
Donc, -1
=> -1 + (UINT_MAX + 1)
= UINT_MAX
, pour ce scénario.