logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] erreur: conversion d'un nombre en binaire  (Lu 9300 fois)
Sarcadent

Profil challenge

Classement : 2728/54278

Néophyte
*
Hors ligne Hors ligne
Messages: 9


Voir le profil
« 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
Journalisée

A Great Day For Freedom
pixis
Administrateur

Profil challenge

Classement : 16/54278

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #1 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 
« Dernière édition: 05 Novembre 2015 à 11:33:30 par pixis » Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
Sarcadent

Profil challenge

Classement : 2728/54278

Néophyte
*
Hors ligne Hors ligne
Messages: 9


Voir le profil
« #2 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 ;
}
Journalisée

A Great Day For Freedom
harvey

Profil challenge

Classement : 12/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #3 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").
« Dernière édition: 06 Novembre 2015 à 10:54:29 par harvey » Journalisée

L'entropie vient en mangeant.
pixis
Administrateur

Profil challenge

Classement : 16/54278

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #4 le: 06 Novembre 2015 à 10:18:44 »

Merci pour la correction de ma bêtise et pour les informations !
Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
Pages: [1]
  Imprimer  
 
Aller à: