Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » caractere '§' (10 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Invité Ecrit le: Samedi 26 juin 2004 à 21:42 Déconnecté(e)    
 
Bonjour à tous ;)


Voila, j'ai trouvé quelque chose de bizarre dans TIGCC
quand je tape le programme suivant :


clrscr();
printf("%d",'§');

La ti virtuelle m'affiche -89

C'est bizare, car je n'ai jamais vu de nombre négatif dans le code ASCII

A moins que ce caractère soit un caractère réservé spécial??
    
./Post n°1   Marquer comme non lu.
Benjy Ecrit le: Samedi 26 juin 2004 à 21:50 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


lol tu veut faire quoi avec le caractere § l'afficher??
Le langage C y'a pas mieux!!!
    
./Post n°2   Marquer comme non lu.
Invité Ecrit le: Samedi 26 juin 2004 à 22:24 Déconnecté(e)    
 
Le code ASCII en décimal de § est 167, soit en binaire :

00000000000000000000000010100111

-89 s'écrit en binaire :

11111111111111111111111110100111


On constate donc que l'octet de poids faible est identique pour les deux nombres, mais que le reste est à 1 partout pour -89 alors qu'il devrait être à 0 (car le code devrait valoir 167, et non -89).

Ce qui se passe est donc facilement explicable en assembleur.
Si on écrit :

move.l #$FFFFFFFF,d0

alors en binaire d0=11111111111111111111111111111111

et si on écrit à la suite :

move.b #%10100111,d0

alors en binaire d0=11111111111111111111111110100111

Donc ce qui se passe est simple : seule la partie basse de d0 a été changée, le reste restant à 1, et donnant le résultat -89.

J'espère que mes explications seront claires... #question#
    
./Post n°3   Marquer comme non lu.
Invité Ecrit le: Samedi 26 juin 2004 à 22:38 Déconnecté(e)    
 
ok, merci je crois que j'ai compris... je ferai alors une division pour avoir la bonne partie. (mais c'est bizare quand même que TIGCC mette tous ces bits en trop non?
    
./Post n°4   Marquer comme non lu.
Invité Ecrit le: Samedi 26 juin 2004 à 22:47 Déconnecté(e)    
 
je pense que c'est lié au programme, et non à TIGCC. essai d'effacer le contenu du registre qui contient le code du caractère juste avant la ligne printf, et peut etre que ca va marcher.
    
./Post n°5   Marquer comme non lu.
Invité Ecrit le: Samedi 26 juin 2004 à 23:04 Déconnecté(e)    
 
même en remettant la variable à zéro avant de faire nombre = '§' ça me fait la même chose
    
./Post n°6   Marquer comme non lu.
Sasume Ecrit le: Samedi 26 juin 2004 à 23:34 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

C'est l'extension sur 16 bits qui provoque ça (le bit de signe étant armé, tout l'octet de poids fort passe à 1).

Cependant, '§' est déjà de type int, donc ne devrait pas subir de promotion char -> int.
Soit c'est un bug, GCC considère que '§' est de type char.
Quoiqu'il en soit, pour corriger le bug, il te suffit de transtyper '§' en unsigned char :

printf("%d",(unsigned char)'§');
    
./Post n°7   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 26 juin 2004 à 23:42 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


'§' est évidemment de type char. Or les chars sont signed sous TIGCC, donc voilà.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°8   Marquer comme non lu.
Sasume Ecrit le: Samedi 26 juin 2004 à 23:45 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Ah, il me semblait qu'en C (mais je ne sais plus quelle norme, sûrement C ANSI), toute expression constante était un int, puis si int ne permet pas de contenir la valeur de l'expression, on passait à des types plus "grands".
    
./Post n°9   Marquer comme non lu.
Kevin Kofler Ecrit le: Dimanche 27 juin 2004 à 00:02 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Oui, mais la promotion automatique effectuée est char->int, et les 2 sont signés, donc c'est une extension de signe.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°10   Marquer comme non lu.
Sasume Ecrit le: Dimanche 27 juin 2004 à 00:02 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Après vérification, d'après le paragraphe 6.4.4.4.10 de la norme du C99, une constante caractère est bien de type int, mais sa valeur est obtenue en lui appliquant la promotion char -> int (donc ça revient à ce que tu as dit ;));
    
  :: Index » Forum Ti68K » Programmation C » caractere '§' (10 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 78.51ms avec 23 requetes