salut,
est-il possible de créer une variable avec un nombre n de bit (ex: 512bits) ?
Version imprimable
salut,
est-il possible de créer une variable avec un nombre n de bit (ex: 512bits) ?
Ce n'est pas portable partout, car le type char doit faire 8 bits
Une variable ou un type ?Code:
1
2
3 typedef struct quelconque { unsigned char nom [64]; //64*8 = 512 };
http://www.linux-kheops.com/doc/ansi-c/node90.htm
j'ai testé vite fait... en fait ça marche dans les structures, je ne sais pas pourquoi ça marche pas ailleur. tu créés une struct montype du genre
Code:
1
2
3
4 typedef struct montype { unsigned int var:n; }montype;
@reptils:
C'est indiqué dans la FAQ DVP.com aussi. Mais pour 512 bits, ça ne marche plus...
Pas de façon portable. En plus, ça ne sert à rien.Citation:
Envoyé par Emcy
n doit être une expression constante valent 1 à 16 pour être portable.Citation:
Envoyé par reptils
Par exemple, avec gcc sur x86 :
donne :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "stdio.h" int main (void) { typedef struct montype { unsigned int var:33; } montype; return 0; }
Code:
1
2
3
4
5
6
7
8
9
10
11 Project : Forums Compiler : GNU GCC Compiler (called directly) Directory : C:\dev\forums\ -------------------------------------------------------------------------------- Switching to target: default Compiling: main.c main.c: In function `main': main.c:8: error: width of `var' exceeds its type Process terminated with status 1 (0 minutes, 0 seconds) 1 errors, 0 warnings
La +1, je ne vois pas pourquoi créer un type spécial...Citation:
Envoyé par Emmanuel Delahaye
c'est vrai que 256bits j'y suis allé peut être un peu fort mais c'etait juste une question que je me posais => par exemple sur certains µC, il n'y a pas de type qui designe un entier de 64bits... comment fait-on alors pour faire des calculs avec de grands chiffre si on a besoins de faire des calculs très très très très très (j'en ai mis assez ?) précis ?
Il existe des bibliothèques qui gèrent des nombres entiers de taille infinie (BigNum, par exemple). Evidement, ça prend de la place et c'est lent... Sinon, on aurait pas inventé les machines 32-bit, puis 64, 128 etc. Le logiciel ne sera jamais aussi performant que le matériel.Citation:
Envoyé par Emcy
Le choix de ton micro-contrôleur n'est peut être pas adapté à ce que tu veux faire.
Je suppose qu'il existe des bibliothèques spécialisées, non ?Citation:
Envoyé par Emcy
Edit: Argh ! Encore grillé !
Je n'ai pas le probleme, c'est juste que j'ai vu un mec sur un forum qui avait ce probleme et je me demandais comment c'etait possible de le resoudre (comme ça je me coucherais moins con ce soir)Citation:
Envoyé par Emmanuel Delahaye
=> comment sont conçu ces bibliothèques ?
Par exemple, les données sont des tableaux de taille variables,Citation:
Envoyé par Emcy
et chaque opérateur est réécrit pour s'adapter à la taille du tableau.Code:
1
2
3
4
5
6 struct data { unsigned char *p; size_t size; };
copy(), cmp(), add(), sub(), mult(), div(), mod (), inc(), dec() etc.
Hélas, si c'était vrai !Citation:
Envoyé par Ti-R
Personnellement, j'ai déjà dû intervenir sur des formats de fichiers qui contiennent des données sur 10 bits, 12 bits... (formats de données satellitaires où l'économie du moindre bit est critique compte tenu des volumes en jeu).
Et là, je dois vous avouer qu'on doit faire des concessions à la portabilité (qu'on utilise des types de données spéciaux ou des masques).
Autant utiliser des masques, mais pour son problème cela ne sert surement à rien...
Sauf système très spécial, l'unité de compte dans un fichier, c'est l'octet, et ça ne dépend pas de l'implémentation. Pour manipuler un octet en C, on utilise un type char ou unsigned char.Citation:
Envoyé par Corentor
Maintenant, qu'il y ait des données de 12 bits, pourquoi pas... Il suffit de lire 2 octets à la suite. Si le format est compressé, il faut maintenir un compteur de bits pour extraire les données à coup de masques et de décalages.
Mais, (sauf système étrange), un fgetc() ne retournera jamais autre chose qu'une donnée sur 8 bits (ou EOF).
mais comment gere t-on la retenue ?Citation:
Envoyé par Emmanuel Delahaye
La technique habituelle est de ne pas utiliser le type le plus long mais le type le plus long pour lequel tous les résultats de calculs sont représentables dans le type le plus long. Si tu as un long long de 64 bits, tu utilises comme "chiffre" un type de 32 bits. Et tu gères les dépassements à la main comme un grand.Citation:
Envoyé par Emcy
un exemple (je ne sais toujours pas comment on fait) ?Citation:
Envoyé par Jean-Marc.Bourguet
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 typedef unsigned char digit; typedef long long word; ... word carry = 0; for (i = 0; ....) { word res = (word)a[i] + (word)b[i] + carry; carry = 0; if (res > MAX_DIGIT) { ++carry; res -= MAX_DIGIT; } c[i] = res; }
=> MAX_DIGIT, ça vaut combien ?Citation:
Envoyé par Jean-Marc.Bourguet
=> que se passe t-il si on fait :
=> c prend plus de memoire que sont type ou il est tronqué ?Code:
1
2
3
4
5 unsigned char a = 0xFF; unsigned char b = 0x05; unsigned char c; c = a + b;
++carry; c'est pareil que carry++; ?