Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1527 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2073634
rahela
Posté le 03-05-2011 à 22:06:05  profilanswer
 

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

mood
Publicité
Posté le 03-05-2011 à 22:06:05  profilanswer
 

n°2073663
daadou
Posté le 03-05-2011 à 23:49:59  profilanswer
 

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

n°2073668
masklinn
í dag viðrar vel til loftárása
Posté le 04-05-2011 à 00:16:49  profilanswer
 

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
n°2073732
rahela
Posté le 04-05-2011 à 11:43:19  profilanswer
 

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
n°2073793
Joel F
Real men use unique_ptr
Posté le 04-05-2011 à 15:10:20  profilanswer
 

le mettre dans un entier signé :o

n°2073796
Un Program​meur
Posté le 04-05-2011 à 15:22:26  profilanswer
 

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)
n°2073798
Joel F
Real men use unique_ptr
Posté le 04-05-2011 à 15:25:18  profilanswer
 

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

n°2073815
Un Program​meur
Posté le 04-05-2011 à 15:49:05  profilanswer
 

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)
n°2073817
masklinn
í dag viðrar vel til loftárása
Posté le 04-05-2011 à 15:51:57  profilanswer
 

Ç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
n°2073834
Un Program​meur
Posté le 04-05-2011 à 16:14:30  profilanswer
 

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)
mood
Publicité
Posté le 04-05-2011 à 16:14:30  profilanswer
 

n°2073900
rahela
Posté le 04-05-2011 à 20:26:31  profilanswer
 

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 ?

n°2073931
rahela
Posté le 04-05-2011 à 23:03:28  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Fonction strstr, question sur ce qu'elle renvoit.[Mysql] DELETE et conserver un nombre fixe de lignes
Question sur hébergement OVHQuestion de mise en forme conditionnelle dans VBA
Nombre sur XX digit[C++] (2) Une histoire de vector
[VHDL] Question concernant les case avec des ifQuestion sur les fichiers .vcf
Question Clés Primaires MySQL pour notre cas...[obj-c] Question de maths..
Plus de sujets relatifs à : Une question peut être bête : reconnaitre nombre binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR