Nombre non signe - C - Programmation
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
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
Marsh Posté le 07-12-2004 à 19:25:42
Citation : alors que pour un nombre signé, ce bit est obligatoirement à 1 et inutilisable |
Marsh Posté le 07-12-2004 à 19:43:40
HelloWorld a écrit :
|
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
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 ?
Marsh Posté le 07-12-2004 à 20:07:02
Harkonnen a écrit : |
houla, t'es de plus en plus balaise toi
Marsh Posté le 07-12-2004 à 20:19:33
Taz a écrit : houla, t'es de plus en plus balaise toi |
quoi ?
-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 ?
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
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.)
Marsh Posté le 07-12-2004 à 20:40:51
Emmanuel Delahaye a écrit : Non, pas du tout. |
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
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 :
|
est-ce que tu prévois ça aussi :
Code :
|
Marsh Posté le 07-12-2004 à 20:46:22
Emmanuel Delahaye a écrit : Non, pas du tout. |
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
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 |
Tu peux aussi corriger ton post...
Ok, Je supprime le mien.
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.
Marsh Posté le 07-12-2004 à 20:53:07
Lam's a écrit : |
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)
Marsh Posté le 07-12-2004 à 21:00:38
Lam's 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
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 |
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
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
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 z790 Gaming Plus Wifi | i9-12900K + Dark Rock Pro4 | 64Go G-Skill DDR4 4800 | RTX 3080 Ti