Nombre non signe

Nombre non signe - C - Programmation

Marsh Posté le 07-12-2004 à 19:10:05    

Bonjour,
 
J'aimerais savoir ce qu'est un nombre non signe en base binaire ? En fait je suis entrain de recoder un bon morceau de la fonction printf et j'arrive a la gestion de %b qui affiche le nombre non signe en base binaire... Alors la je suis perdu  
:??:
 
Merci d'avance pour votre aide.


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 07-12-2004 à 19:10:05   

Reply

Marsh Posté le 07-12-2004 à 19:13:23    

en binaire, un nombre non signé n'utilise pas son bit de poids le plus fort pour le signe, alors que pour un nombre signé, ce bit est obligatoirement à 1 et inutilisable


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 19:19:58    

tu peux pas deviner s'il ai signé ou pas, au mec de pas se planter dans l'argument

Reply

Marsh Posté le 07-12-2004 à 19:25:42    

Citation :

alors que pour un nombre signé, ce bit est obligatoirement à 1 et inutilisable


:??:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-12-2004 à 19:43:40    

HelloWorld a écrit :

Citation :

alors que pour un nombre signé, ce bit est obligatoirement à 1 et inutilisable


:??:

je veux juste dire que le dernier bit d'un nombre signé ne peut pas servir à autre chose que pour le signe. Emporté dans mon élan, j'ai dit une connerie, il est pas forcément à 1. bit à 1 = négatif, bit à 0 = positif
 
un octet signé => 7 bits utilisables => de -128 à +127
un octet non signé => 8 bits utilisables => de 0 à 255


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 19:53:41    

Mais il faut que je transforme un unsigned int en binaire pour gerer le %b alors non ?


---------------
~ Msi z270 Gaming Pro Carbon | i7 7700K @4.8Ghz + Dark Rock Pro4 | 16Go Corsair DDR4 2400 | RTX 2080 Ti | OS SSD 840 + Jeux Raid0 SSD 850 + 2*2To Seagate | Cooler Master Cosmos 1000 + Corsair CMPSU-620HX
Reply

Marsh Posté le 07-12-2004 à 20:07:02    

Harkonnen a écrit :


un octet signé => 7 bits utilisables => de -128 à +127

houla, t'es de plus en plus balaise toi

Reply

Marsh Posté le 07-12-2004 à 20:19:33    

Taz a écrit :

houla, t'es de plus en plus balaise toi


quoi ? [:heink]
-128 en binaire donne 10000000 (sur un octet, sinon le bit de signe est étendu sur les bits 9 à 31) et +127 donne 01111111 (idem), seuls les 7 bits de poids faibles sont utilisés, le dernier est utilisé pour le signe non ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 20:21:42    

Harkonnen a écrit :

seuls les 7 bits de poids faibles sont utilisés, le dernier est utilisé pour le signe non ?

ah désolé, t'as dit 7 + 1, je croyais que t'avais dit 8 :)

Reply

Marsh Posté le 07-12-2004 à 20:35:56    

Tonio94 a écrit :

J'aimerais savoir ce qu'est un nombre non signe en base binaire ? En fait je suis entrain de recoder un bon morceau de la fonction printf et j'arrive a la gestion de %b qui affiche le nombre non signe en base binaire... Alors la je suis perdu  


"%b", ça n'existe pas en C standard. C'est peut être une extension...
 
L'affichage en base 2 consiste à utiliser les chiffres 0 et 1 pour afficher une valeur numérique (non signée).
 
128 -> "10000000"
 
Comme la représentation interne d'une valeur numérique est du binaire, c'est assez simple en utilisant une boucle et des opérateurs 'bit'. (&, ~, >>, << etc.)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-12-2004 à 20:35:56   

Reply

Marsh Posté le 07-12-2004 à 20:40:51    


chut, c'est comme pour le mur de Berlin, on lui a pas encore dit. Tu va lui faire une attaque cardiaque si tu continues.
 
Harko> Ne l'écoutes pas, c'est un jeune, il plaisante. Regarde, même Microsoft le dit. Le premier bit est le bit de signe: http://research.microsoft.com/~hol [...] float.html


Message édité par Lam's le 07-12-2004 à 20:41:36
Reply

Marsh Posté le 07-12-2004 à 20:41:32    

Tonio94 a écrit :

Mais il faut que je transforme un unsigned int en binaire pour gerer le %b alors non ?


Tu ne peux pas le savoir, surtout que le passage de paramètre se fera dans un int si rien n'est précisé. C'est à l'opérateur d'utiliser un unsigned, ou de placer un cast dans l'appel du my_printf ().

Code :
  1. int a = 12345;
  2.    my_printf ("%b\n", (unsigned) a);


est-ce que tu prévois ça aussi :

Code :
  1. long b = 12345678;
  2.    my_printf ("%lb\n", (unsigned long) b);


Message édité par Emmanuel Delahaye le 07-12-2004 à 20:42:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-12-2004 à 20:46:22    


 

Lam's a écrit :

chut, c'est comme pour le mur de Berlin, on lui a pas encore dit. Tu va lui faire une attaque cardiaque si tu continues.


 
j'ai dit que j'avais dit une connerie emporté par mon élan, connerie que j'ai rectifié ensuite, messieurs, faut lire les posts suivants :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 20:47:23    

Harkonnen a écrit :

j'ai dit que j'avais dit une connerie emporté par mon élan, connerie que j'ai rectifié ensuite, messieurs, faut lire les posts suivants :o


Tu peux aussi corriger ton post...
 
Ok, Je supprime le mien.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-12-2004 à 20:48:37    

T'as persisté avec une connerie plus grosse:
 

Harkonnen a écrit :

seuls les 7 bits de poids faibles sont utilisés, le dernier est utilisé pour le signe non ?


 
Non. Un nombre négatif s'obtient en faisant le complément à 2 de son opposé. Recette de cuisine toute bête : tu inverses tous les bits (un NOT en ASM), et tu ajoutes 1.
 
Donc:
0   -> NOT = 11111111  -> +1 = 00000000
1   -> NOT = 11111110  -> +1 = 11111111
127 -> NOT = 10000000  -> +1 = 10000001
 
et -128 = -127 -1 = 10000000
 
Donc, effectivement, tous les négatifs ont le bit de poids fort à 1, et c'est pour ça qu'on l'appelle parfois à tort "bit de signe", même si ce n'est pas juste ce bit qui décide du signe. Donc ce n'est pas un vrai bit de signe comme pour les flottants par exemple.
 

Reply

Marsh Posté le 07-12-2004 à 20:53:07    

Lam's a écrit :


Non. Un nombre négatif s'obtient en faisant le complément à 2 de son opposé.  


Et pour compléter cet excellent article, ajoutons que ce mode de représentation des nombres négatifs (complément à 2), même si c'est le plus courant, n'est pas le seul supporté par le langage C. Sur certaines plateformes, ça peut aussi être 'complément à 1' ou 'sign-magnitude' (proche des flottants)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-12-2004 à 21:00:38    

Lam's a écrit :


Non. Un nombre négatif s'obtient en faisant le complément à 2 de son opposé. Recette de cuisine toute bête : tu inverses tous les bits (un NOT en ASM), et tu ajoutes 1.


ah putain, je cours me cacher, le pire c'est que je l'ai su (y'a très très longtemps), mais à force, tu finis par céder à la facilité et considérer le dernier bit comme le bit de signe :sweat:
 
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 21:03:56    

Harkonnen a écrit :

ah putain, je cours me cacher, le pire c'est que je l'ai su (y'a très très longtemps), mais à force, tu finis par céder à la facilité et considérer le dernier bit comme le bit de signe :sweat:
 
[:neowen]


Ouais enfin, t'avais pas complètement tort, comme l'as dit Emmanuel.  
 
Le standard C te garantis uniquement un intervalle [-127, 127] à tes signed char, pour que ça puisse tourner même la-dessus:
http://www.frobenius.com/7090.htm

Reply

Marsh Posté le 07-12-2004 à 22:26:47    

sinon la technique du bulldozer est pas mal aussi.
 
tu parts de la droite à la recherche du premier 1, tu le gardes et tu inverse le reste:
 
100dec => (0..0 implicites) 01100100 bin
premier 1 en partant de la droite:
 
(0..0) 01100100
Tu gardes et t'inverse le reste:
(1..1) 10011100
 
sont forts ces russes :D


Message édité par bjone le 07-12-2004 à 22:27:36
Reply

Sujets relatifs:

Leave a Replay

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