NewbieContest

Programmation => Langages compilés => Discussion démarrée par: Sarcadent le 04 Novembre 2015 à 16:56:28



Titre: [C] erreur: conversion d'un nombre en binaire
Posté par: Sarcadent le 04 Novembre 2015 à 16:56:28
Hello, je me suis amusé a faire un code pour afficher la valeur d'un nombre en binaire cependant mon code ne marche qu'avec des unsigned int.
Lorsque j'utilise des int le motif binaire affiche des -1 à la place des 1.

Es ce que vous aurez une idée de pourquoi?

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
//attention comportement bizarre avec des types qui comprennent des négatif
        // si on remplace le int n par unsigned int n ça marche
        int n = 12;
int i;
printf("n représenté en binaire = ");

for (i = 0; i < 8*sizeof(n); i++){
printf("%d",n<<i>>(8*sizeof(n)-1));
}

    return EXIT_SUCCESS ;
}

Ps: je me suis dis que c'était surement à cause de la représentation d'un entier signé en binaire avec le dernier bit mais je ne me l'explique pas vraiment

Cordialement Sarcadent


Titre: Re : [C] erreur: conversion d'un nombre en binaire
Posté par: pixis le 04 Novembre 2015 à 17:25:22
Hey there.
On pourra compléter ma réponse, mais personnellement, j'aurais fait comme ceci :

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
    int n = 12;
    int i;
    printf("n représenté en binaire = ");

    for (i = 0; i < 8*sizeof(n); i++){
        printf("%d",((n<<i)&0xffffffff)>>(8*sizeof(n)-1));
    }
    putchar('\n');

    return EXIT_SUCCESS ;
}

En effet, lors du shifting des bits, il est important de s'assurer que les bits qui "dépassent" soient bien égaux à 0 (ce que je fais en faisant un ET logique avec la taille limite d'un int sur 32 bits). C'est pas générique, mais ça donne l'idée.

Moche, mais ça a le mérite de fonctionner  :rolleyes:


Titre: Re : [C] erreur: conversion d'un nombre en binaire
Posté par: Sarcadent le 04 Novembre 2015 à 21:42:05
merci beaucoup :) oui faut effectivement vérifier les bits qui sont ajoutés.

je l'ai refais avec un masque ce qui revient à ce que tu as fais :)
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
int n = 1332;
int m = 1; //masque 0x1
int i;
printf("n représenté en binaire = ");

for (i = 1; i <= 8*sizeof(n); i++){
printf("%d",m&(n>>(8*sizeof(n)-i)));
}

    return EXIT_SUCCESS ;
}


Titre: Re : [C] erreur: conversion d'un nombre en binaire
Posté par: harvey le 06 Novembre 2015 à 07:03:14
Citation de: Pixis
En effet, lors du shifting des bits, il est important de s'assurer que les bits qui "dépassent" soient bien égaux à 0
Il n'y a pas de bits qui dépassent, un entier a toujours le même nombre de bits après un shift. Ce qui se passe dans ton code, c'est que le littéral 0xffffffff est un unsigned int, et que le & entre un int et un unsigned int renvoie un unsigned int. D'ailleurs avec un unsigned int j=0, un "|j" a le même effet (voir "conversions arithmétiques habituelles"). Le résultat de l'expression, un unsigned int, est ensuite imprimé comme un int.

Dans le premier code de Sarcadent, le problème est que l'opérateur << est susceptible de changer le signe, tandis que >> le conserve (voir "complément à deux").


Titre: Re : [C] erreur: conversion d'un nombre en binaire
Posté par: pixis le 06 Novembre 2015 à 10:18:44
Merci pour la correction de ma bêtise et pour les informations !