Bonjour,

Je travaille actuellement sur un projet manipulant des données au niveau bit.

J'ai trouvé la fonction get_binary sur votre site. Elle pourrait m'être utile pour tester les fonctions que je développe en controllant le motif binaire de mes sorties par rapport à celui de les entrées.

Malheureusement, cette fonction a un comportement que je n'arrive pas à m'expliquer :
  • elle fonctionne parfaitement sur les unsigned int, unsigned long int et unsigned long long int mais,
  • elle echoue pour les unsigned char et les unsigned short int.


Bien entendu, pour chaque nouveau type, je modifiais le code source. Voici, un exemble pour le motif binaire d'un unsigned short int :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
 
char * get_binary (unsigned short val, size_t * tab_size)
{
   size_t size = sizeof (unsigned short) * CHAR_BIT;    /* Taille du type.      */
   size_t i = 0;
   char * tab = NULL;
 
 
   tab = malloc (size);
 
   if (tab != NULL)
   {
      for (i = 0; i < size; i++)
      {
         /*
          * On recupere les bits de la variable un par un en commencant
          * par les bits de poids faible (bits de droite) mais on les insere
          * dans le sens de lecture normal d'un etre humain soit de gauche
          * a droite.
          */
         tab[size - i - 1] = (val << (size - i - 1)) >> (size - 1);
      }
 
      if (tab_size != NULL)
      {
         *tab_size = size;
      }
   }
 
 
   return tab;
}
 
 
int main (void)
{
   char * tab = NULL;
   size_t size = 0;
   size_t i = 0;
   unsigned short test = 90;
 
 
   tab = get_binary (test, & size);
 
   if (tab != NULL)
   {
      printf ("%d bits\n", size);
      for (i = 0; i < size; i++)
      {
         printf ("%d", tab[i]);
      }
      printf ("\n");
   }
 
   free (tab);
 
 
   return EXIT_SUCCESS;
}
L'auteur original de ces sources est Franck H. Je le remercie au passage pour ce petit programme pratique.

Mes tentatives de debuggage m'ont permis de determiner que la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
tab[size - i - 1] = (val << (size - i - 1)) >> (size - 1);
était à l'origine des bugs.

Quelqu'un aurait-il une explication ?


Merci d'avance,


Michaël