Bonjour JJE,
En C chaque variable est typée, sa nature et sa taille sont fixes et ne peuvent changer en cours de route.
Le type int n'a pas une taille déterminée, il dépend de la cpu et du compilateur.
C18, xc8 et MikroC stockent un int sur 16 bits, prenant en charge la partie asm permettant de manipuler une variable 16 bits avec un processeur 8 bits.
A part ça, le C n'en fait guère plus que l'asm. Dans les calculs d'entiers, le signe n'a pas d'importance grâce au complément à 2.
Les 4 syntaxes i = i+1, i += 1, i++, ++i modifient i de la même façon.
int i = 0x7ffff;
unsigned int i = 0x7ffff;
int i = 0xfffff;
unsigned int i = 0xfffff;
Pas d'erreur ni warning C18, il devrait pourtant rouspéter car il tronque à 16 bits -> i = 0xffff dans tous les cas
i = 0x7fff; i++;
Le résultat 0x8000 est le même quel que soit le type de i.
Si i est unsigned, pas de problème, on est passé de +32767 à +32768.
Si i est signed, on est passé de +32767 à -32768.
Le C comme l'asm ne fera rien, c'est au programmeur de faire en sorte qu'il n'y ait pas d'overflow non volontaire.
On peut quand même détecter le changement de signe lors de l'opération en testant le bit haut b15 de i avant et après l'opération.
i = 0xffff; i++;
Le résultat 0x0000 est le même quel que soit le type de i.
Si i est signed, pas de problème, on est passé de -1 à 0.
Si i est unsigned, on a un overflow.
Je ne sais pas si les bits C,Z,N,OV du registre STATUS sont bien à jour après une opération C sur entier car il calcule sur 16 bits.
En C on est éloigné du processeur, alors il ne faut pas trop lui demander si on a bien ou mal fait :)
Si tu installes C18, tu pourras tester tout cela sous simulateur MPLAB, en créant un projet tout simple avec ce source.
Code : Tout sélectionner
#include <p18cxxx.h>
void main(void)
{
while (1) {
int i = 0x7fff;
i += 1;
i -= 1;
}
}