Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Petite interrogation
JJE
Passioné
Passioné
Messages : 357
Âge : 79
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » ven. 21 juin 2019 06:22

Bonjour à tous,
mes premiers pas sur ce sous-forum, je fréquente plutôt le sous-forum ASM mais je me pose une question à propos du ou des compilateurs C utilisés pour générer du code pour ces pics.
Comment se comporte le code généré par les instructions suivantes :

Code : Tout sélectionner


int i
= 0x7fff    (ou &h7fff ?)
+= 1

Dans ma cuture,

    int i signifie que i est géré comme un entier signé (donc en complément à 2) 16 bits.
    la déclaration peut être n'importe où dans le source, du moment que mon instruction est dans sa portée
    l'initialisation est là pour l'exemple, i pouvant avoir atteint cette valeur d'une quelconque autre manière
je pourrais poser la même question avec la séquence

Code : Tout sélectionner


int i
= 0x8000
= -i


Excusez moi de vous solliciter mais je n'ai pas encore installé de compilateur C et ce serait un trop gros travail pour répondre à une aussi petite question.

Merci d'avance
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Petite interrogation
Jérémy
Administrateur du site
Administrateur du site
Messages : 2371
Âge : 40
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » ven. 21 juin 2019 07:29

Bonjour à tous,

Je ne connais pas grand chose en Assembleur, mais je sais le reconnaitre c'est déjà ca !

J'ai rentré ton code dans mon compilateur mikroC . et voici le fichier ASM qu'il me donne pour une optimisation de code à 0 .

Code : Tout sélectionner

_main:

;
MyProject.c,::         void main() {
;
MyProject.c,::         0x7fff;   // (ou &h7fff ?)
    
MOVLW      255
    MOVWF      main_i_L0
+0
    MOVLW      127
    MOVWF      main_i_L0
+1
;MyProject.c,::         += 1;
    
INCF       main_i_L0+01
    BTFSC      STATUS
+02
    INCF       main_i_L0
+11
;MyProject.c,::         }
L_end_main:
    GOTO       $+
0
end of _main


et avec une optimisation à 4 :

Code : Tout sélectionner


_main
:

;
MyProject.c,::         void main() {
;
MyProject.c,::         }
L_end_main:
    GOTO       $+
0
end of _main



Est-ce que cela répond à ta question ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Petite interrogation
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1503
Âge : 69
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » ven. 21 juin 2019 09:22

bonjour à tous,



int ,unsigned int , signed int
c'est surtout la façon dont on veut representer le mot de 16 bits

voir test ci dessous
avec
unsigned int Nb;
signed int i;

la preuve, est que le debugger mikroc nous demande si on veut visualiser la variable 16 bits en signed ou pas
via une case à cocher !
de meme mikroc propose :
IntToStr pour convertir un entier signé en texte
ou
WordToStr pour convertir un entier NON signé

c'est donc bien au programmeur de choisir SA REPRESENTATION du mot choisi

Là ou ça peut se gater ,c'est dans les operations mathematiques addition et soustraction ...
Le resultat est tres dependant de ce qui a été declaré en int ou Word
j'utilise d'ailleur preferablement Word pour un entier non signé
#define Word unsigned int

:!!: de meme pour les boucles

for (i=20;i>=0;i--) surprise avec un unsigned int qui repasse à 65535 en dessous de 0

test.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou Fantastpic t'aideras

Petite interrogation
JJE
Passioné
Passioné
Messages : 357
Âge : 79
Enregistré en : novembre 2017
Localisation : Picardie

#4 Message par JJE » ven. 21 juin 2019 11:16

Bonjour Jérémy et Paulf jujo, d'abord Jérémy
Jérémy a écrit :Source du message Est-ce que cela répond à ta question ?

pas exactement, elle était
JJE a écrit :Source du message Comment se comporte le code généré par les instructions suivantes :

et non
Quel est le code généré par les instructions suivantes :[

cependant, elle répond quand même à ma question, il s'en fout complètement du problème.
Dans ton programme, aucune déclaration de la variable i, c'est normal ? la prend-il par défaut comme un entier 16 bits signés ?

à Paul, mais ça peut intéresser Jérémy
paulfjujo a écrit :Source du message c'est surtout la façon dont on veut representer le mot de 16 bits
, je ne suis pas entièrement d'accord, c'est un choix à faire en fonction de l'entité que va représenter une variable dans un programme. Par exemple un compteur qui ne peut pas dépasser 2^16-1 sera bien représenté par un unsigned integer, si on est sûr qu'il est cantonné à 256, un byte (qui est en général unsigned par défaut) fera bien l'affaire, mais une entité pouvant devenir négative, dans la plage -2^15, 2]15-1devra être représentée par un signed integer, en général le signed est optionnel dans les C que j'ai pratiqué :-)
paulfjujo a écrit :Source du message IntToStr pour convertir un entier signé en texte
ou
WordToStr pour convertir un entier NON signé

et il a bien raison, les 16 bits ne se traduisant pas du tout de la même manière, si le bit 15 vaut 1 :-)
merci pour les copies d'écran qui éclairent très bien le problème. Il semble donc que le programmeur doive faire les pieds au mur pour assurer le non dépassement de capacité de son programme :
pour un signed, tester que le résultat reste positif s'il l'était avant l'encrémentation :sifflotte:
pour un unsigned, tester que le résultat n'est pas nul, plus facile :-)
En fait, je crois que tout le monde s'en fout, sauf les cas rares où ça pause problème et ce problème risque d'être délicat à trouver :-D

Merci à vous deux
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité