complément à  1 [Résolu]

ancrouancrou Membre
juin 2008 modifié dans API AppKit #1
Bonjour,

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 &amp; 0x8000)==0x8000){//si négatif<br />		chiffre = ~chiffre; //complément<br />		value=chiffre;		//cast<br />		value = (value+1)*(-1);<br />		NSLog(@&quot;angle : %d&quot;,value);<br /><br />	}else<br />		value =chiffre;<br />	return value;<br />}


Vous en pensez quoi ?

Merci

Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2008 modifié #2
    Dis, au passage, c'est un complément à  2 que tu fais, pas à  1, puisqu'ensuite tu ajoutes 1 à  la valeur dont tu as inversé tous les bits ;)

    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
    double dVal = (double)( *(SI16_*)(&amp;chiffre) );
    

    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.
  • ChachaChacha Membre
    14:57 modifié #3

    NSLog(@angle : %d,value);


    NSLog(@angle : %f,value); ?
  • ancrouancrou Membre
    14:57 modifié #4
    un jolie cast suffie, en effet :
    int pAxis= (int)(SI16_)(angle);<br />NSLog(@&quot;%d&quot;);
    


    Je suis repassé en int après le double  :o

    Merci
Connectez-vous ou Inscrivez-vous pour répondre.