[C] Comment définir un type de donnée binaire de taille variable ?

Comment définir un type de donnée binaire de taille variable ? [C] - C - Programmation

Marsh Posté le 26-05-2005 à 14:13:36    

Bonjour,
 
je voudrais définir un type de donnes binaires de taille variable  
(tailles exemples : 17 bits, 12 bits, 23 bits, ...) qui n'est pas
forcément de la taille de char (8 bits) ou int (32 bits).
 
l'idée est qu'en faisant des opérations sur ces nombres
je puisse mettre en évidence le bruit de calcul. en effet,
si je stocke un nombre de 12 bits dans un int de 32 bits,
j'aurai trop de précision lors du calcul.
 
Une idée ?
 
merci :)

Reply

Marsh Posté le 26-05-2005 à 14:13:36   

Reply

Marsh Posté le 26-05-2005 à 14:20:02    

char fait CHAR_BIT bits et int fait sizeof(int) * CHAR_BIT bits, si tu veux un truc fixe regarde dans stdint.h (c99)
 
c'est quoi le bruit de calcul, l'overflow ?

Reply

Marsh Posté le 26-05-2005 à 14:26:20    

le bruit de calcul peut provenir de l'overflow et aussi des arrondis dans certaines opérations (en fait les nombres que je manipule ont une partie entière et une décimale, codées en binaire).
 
c'est le même genre de problème que le bruit de quantification lors de la conversion analogique vers numérique : il dépend du pas de quantif et ici le bruit de calcul dépend de la précision des variables


Message édité par ceyquem le 26-05-2005 à 14:28:31
Reply

Marsh Posté le 26-05-2005 à 14:39:43    

Reply

Marsh Posté le 26-05-2005 à 14:48:02    

hum ça n'a pas l'air très pratique ce truc, ça n'est pas portable, dépendant du compilateur et en plus ils n'ont pas d'adresse :(
 
pas d'autre idée ??

Reply

Marsh Posté le 26-05-2005 à 14:50:53    

alors faudra le gerer toi meme ou peut etre que ca existe deja une bibliotheque qui le fait, genre gmp ?

Reply

Marsh Posté le 26-05-2005 à 15:40:17    

ceyquem a écrit :

hum ça n'a pas l'air très pratique ce truc, ça n'est pas portable, dépendant du compilateur et en plus ils n'ont pas d'adresse :(


  • Pas pratique ? Pas d'accord, et en plus et ca correspond exactement à ce que tu veux faire. Il ne faut pas baisser les bras aussi rapidement...


struct data
{
   unsigned a:17;
   unsigned b:12;
   unsigned c:23;
};
 
{
   struct data x;
 
   x.a = 1234;
}


etc.
 
rien de compliqué.
 
Le type d'un champ de bit est int ou unsigned int. Le C garanti au moins 16 bits pour unsigned int. Sauf antiquité (x-86 mode réel, par exemple) il y a de fortes chances que ta machine supporte des int de 32 bits.
 

  • Pas d'adresse, OK. C'est grave ? On peut toujours passer l'adresse de la structure.


  • Pas portable ? As-tu l'intention d'échanger des données entre des machines en utilisant les champs de bits ?



Message édité par Emmanuel Delahaye le 26-05-2005 à 15:45:24

---------------
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 26-05-2005 à 18:55:58    

Salut!
 
Normalement les "bitfields" sont portables dans la mesure où l'on réserve des bits d'une variable. Ce qui n'est pas portable dit "implementation defined" ce sont les "packed bits" c'est à dire le compactage des bits pour ne pas laisser de trous dans la suite de bits que constitue une structure.


Message édité par bisounours le 26-05-2005 à 18:57:33
Reply

Marsh Posté le 30-05-2005 à 13:19:42    

Si toutes tes variables font moins de 32 bits de long, les bitfields sont une excellente solution. Tu peux aussi utiliser un systeme de masques (&, |) et de décalages binaires (>> << ) mais c'est bien s'emmerder pour arriver au même résultat.
Bon évidemment avec les bitfiels si tu commences à faire des énormes tableaux v'la la perte d'espace mémoire... (une structure = 32 bits, donc c'est bête si t'en utilise 1/4 à chaque fois...)

Reply

Sujets relatifs:

Leave a Replay

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