Une question peut être bête : reconnaitre nombre binaire

Une question peut être bête : reconnaitre nombre binaire - C - Programmation

Marsh Posté le 03-05-2011 à 22:06:05    

Bonsoir !
 
comment reconnait-on, le nombre 1111 1111 1111 1111 s'il est positif ou négatif?
 
car pour moi c'est égal à 65 535 mais c'est aussi -1 .... je sais pas comment dissocier...
 
J'écris un programme qui récupère des nombres, dans un fichier binaire, mais lorsque je récupère un nombre binaire comme celui au dessus, je ne sais pas si c'est -1 ou 65535 ..
Je sais d'autant plus qu'un nombre binaire négatif porte un bit de signe de valeur 1.. mais la quand j'affiche mon nombre binaire il m'affiche 65535 alors que c'est censé être -1..
 
Pouvez vous m'éclairer ?
 
Je vous remercie

Reply

Marsh Posté le 03-05-2011 à 22:06:05   

Reply

Marsh Posté le 03-05-2011 à 23:49:59    

Quand c'est mis en quartet, le bit de singe est séparé des autres.  
C'est une question de notation.

Reply

Marsh Posté le 04-05-2011 à 00:16:49    

rahela a écrit :

Bonsoir !

 

comment reconnait-on, le nombre 1111 1111 1111 1111 s'il est positif ou négatif?


Faut connaitre son type, savoir si c'est signé ou non (et savoir sur combien de bits ça tient, parce que si c'est de l'int32, ben c'est 65535 que ce soit signé ou non).

 

Accessoirement, pour les négatifs, il faut aussi connaitre le schéma de négation (le mode de représentation des nombres signés), c'est généralement du complément à 2 parce que c'est ce qui est implémenté en matériel, mais pas nécessairement.


Message édité par masklinn le 04-05-2011 à 00:17:16

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-05-2011 à 11:43:19    

je ne comprends pas très très bien l'histoire des signés et non signés..
 
voila, j'ai un fichier binaire, contenant des instructions codées sur 5 octets : parmis ces 5 octets, j'extraie les deux suivants : 00111111 11111110
Dans mon programme, je veux extraire les 13 derniers bits : 001 1 1111 1111 1110,
je sais que ce nombre 1 1111 1111 1110 doit être -2 mais quand je l'affiche je vois 8190 .... comment faire ?


Message édité par rahela le 04-05-2011 à 11:45:14
Reply

Marsh Posté le 04-05-2011 à 15:10:20    

le mettre dans un entier signé :o

Reply

Marsh Posté le 04-05-2011 à 15:22:26    

Joel, le bit de signe est le 13ieme, tu en connais beaucoup de machines qui utilisent directement une telle representation?

 

Rehela, si tu as des manips de ce genre a faire, tu as interet a chercher a comprendre la difference entre valeur et representation.  Pour le cas present:

 
Code :
  1. signed v;
  2. unsigned n = 0x1FFE;
  3. v = n | ~((n & 1U << 12) - 1U);



Message édité par Un Programmeur le 04-05-2011 à 15:22:49

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 04-05-2011 à 15:25:18    

han j'avais pas lu XD
 
il le colle dans un entier 16 bit et decale le dernier bit en bit 15 ???

Reply

Marsh Posté le 04-05-2011 à 15:49:05    

Joel F a écrit :

il le colle dans un entier 16 bit et decale le dernier bit en bit 15 ???


 
Si tu veux dire

Code :
  1. int16_t v = 0x1FFE;
  2. v = ((int16_t)(v << 3)) >> 3;


 
A noter que le cast est necessaire a cause des promotions qui font que v << 3 est calcule en int qui font souvent 32 bits.
 
On est dans le domaine du defini par l'implementation, a la fois pour l'existance d'un int16_t et pour le comportement du decalage a droite de valeurs signees (bon, je n'en connais pas qui ne conservent pas le signe et je viens de tester x86, sparc, power, alpha et PA-RISC).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 04-05-2011 à 15:51:57    

Ça peut pas se faire avec des bit fields sinon, comme en erlang [:petrus dei]

Un Programmeur a écrit :

On est dans le domaine du defini par l'implementation, a la fois pour l'existance d'un int16_t


C'est demandé par c99 quand même :o

Un Programmeur a écrit :

et pour le comportement du decalage a droite de valeurs signees


De toute manière t'es déjà dans le domaine de l'UB quand aux négatifs étant du 2-complement non?

Message cité 1 fois
Message édité par masklinn le 04-05-2011 à 15:53:10

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-05-2011 à 16:14:30    

masklinn a écrit :

Ça peut pas se faire avec des bit fields sinon, comme en erlang [:petrus dei]


 
Si bien sur :-)

Code :
  1. struct s {
  2.    signed v : 13;
  3. } n;
  4. n.v = 0x1FFE;
  5. v = n.v;


 

masklinn a écrit :


C'est demandé par c99 quand même :o


 
Les intN_t sont tous optionels.  Si la machine dispose d'un type 8, 16, 32, 64 bits, intN_t est alors obligatoire.
 

masklinn a écrit :


De toute manière t'es déjà dans le domaine de l'UB quand aux négatifs étant du 2-complement non?


 
Defini par l'implementation a nouveau pour le sens unsigned -> signed.  J'ai ete distrait (il est bien defini pour le sens signed -> unsigned).
 
Correction donc:

Code :
  1. signed v;
  2. unsigned n = 0x1FFE;   
  3. unsigned const signBit = 1U << 12;
  4. v = (signed)(n & (signBit-1)) - (signed)(n & signBit);


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 04-05-2011 à 16:14:30   

Reply

Marsh Posté le 04-05-2011 à 20:26:31    

La réponse de Un Programmeur m'a bien aidée,
 
j'ai tout de meme un autre probleme :  
 
 

Code :
  1. signed v;
  2. unsigned n = 0x1FFE;
  3. v = n | ~((n & 1U << 12) - 1U);
  4. signed n = 10;


   Pourquoi v + n  (-2 + 10 ) ne me donne pas 8 ?

Reply

Marsh Posté le 04-05-2011 à 23:03:28    

en fait si, ca me donne bien 8 ! au temps pour moi, je vous remercie en tout cas!
Bonne soirée

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed