Quel compilateur utilises tu sous Windows ?remy a écrit :J'ai isolé un problème dans l'émulation du Z80 sur Android. Voici le code qui pose soucis :
Résultat sur Windows : y=0xCF17Code : Tout sélectionner
unsigned char x = 0xEC; unsigned short y = 0xCF27;; y += (char)(x) + 2;
Résultat sur Android (ARM) : y = 0xD015
La conversion unsigned to signed ne semble pas fonctionner sur Android. Je ne comprends pas pourquoi.
Je suis prenneur de vos lumières.
Car pour moi c'est un problème de conversion implicite de ton compilateur sous windows !
En respectant l'ordre de précédence et de conversions implicites, les opérations doivent être effectuées de la manière suivante :
1) conversion de la valeur de x en char signé : -20 (décimal)
2) conversion implicite de la valeur en entier signé : -20 (décimal)
3) ajout de 2 : -18 (décimal)
4) conversion implicite de la valeur en short non signé : 00EE (hexadécimal)
5) ajout de la valeur à y : y = D015 (hexadécimal)
Ce qui semble être bon sous Android.
De ce que j'en comprend, ton compilateur sous Windows ne respecte pas l'ordre de conversion implicite et effectue les opérations de cette manière :
1) conversion de la valeur de x en char signé : -20 (décimal)
2) conversion implicite de la valeur en entier signé : -20 (décimal)
3) ajout de 2 : -18 (décimal)
4) conversion implicite de y en short signé ? : -12505 (décimal)
5) ajout des deux valeurs ? : -12523 (décimal)
6) conversion en short signé dans y ? : CF15 (hexadécimal)
T'es sur que c'est à 0xCF17 sur Windows ?
D'une manière générale dès que tu as une formule avec des types différents dans un calcul, il faut se méfier des conversions implicites et forcer avec des conversions explicites.
Tu peux essayer de vérifier l'ordre de précédence et de conversion implicite de ton compilateur dans l'aide intégré ...
A+