complément à 1 [Résolu]
ancrou
Membre
Bonjour,
Quand je fait un NSLog de mon nombre signé, je me retrouve toujours avec une valeur non signé !
voila mon programme :
Vous en pensez quoi ?
Merci
Quand je fait un NSLog de mon nombre signé, je me retrouve toujours avec une valeur non signé !
voila mon programme :
-(double)complementA1:(UI16_)chiffre{<br /> double value;<br /> //complément à 1<br /> if((chiffre & 0x8000)==0x8000){//si négatif<br /> chiffre = ~chiffre; //complément<br /> value=chiffre; //cast<br /> value = (value+1)*(-1);<br /> NSLog(@"angle : %d",value);<br /><br /> }else<br /> value =chiffre;<br /> return value;<br />}
Vous en pensez quoi ?
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bon sinon je ne comprends pas pourquoi tu t'embêtes à gérer les cas toi même ?
Car apparemment ta fonction a pour but d'interpréter une série de 16 bits (UI16_) sous forme d'un entier signé à stocker dans un double...
Et pour ça, un cast suffit... du moment qu'il est bien fait :P
Je préfère caster l'adresse de [tt]chiffre[/tt] en [tt]SI16_*[/tt] et prendre son contenu (et non pas caster directement en [tt]SI16_[/tt]) pour qu'il réinterprète les bits au lieu de convertir les valeurs... et une fois qu'on a réinterprété comme si c'était les bits d'un [tt]SI16_[/tt] alors on peut caster en double (conversion cette fois, et non pas réinterprétation des bits en IEEE754) pour avoir le résultat final
Mais ceci dit j'ai testé vite fait directement avec [tt]dVal = (double)(SI16_)(0xfff0)[/tt] et ça me renvoie bien -16 donc le passage par les adresses n'est peut-être pas si obligatoire
NB : Je ne sais pas si le type [tt]SI16_[/tt] existe, je ne suis pas habitué à utiliser ces typedefs là ... mais bon tu vois l'idée
Sinon pour ton code, je pense qu'il ne marche pas car tu ne fais pas assez de casts. Du coup il doit y avoir un cast implicite quelque part qui réinterprète ton nombre comem non signé. Déroutant quand même, mais en plaçant des NSLogs un peu partout avec %x et %d, y'a moyen d'isoler l'endroit où ça le fait.
NSLog(@angle : %f,value); ?
Je suis repassé en int après le double
Merci