OVH Cloud OVH Cloud

Decalages d'un nombre de bits pouvant etre >= a la taille du type

134 réponses
Avatar
Vincent Lefevre
J'ai besoin de faire un décalage vers la droite sur un type entier
(disons non signé) générique (i.e. défini par typedef) d'un certain
nombre constant de bits. Le problème est que ce nombre de bits peut
être supérieur ou égal à la taille du type en question. Une idée
sur la façon de faire ça efficacement sans obtenir de comportement
indéfini et sans passer par un outil du style "configure"?

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

10 réponses

Avatar
Emmanuel Delahaye
Laurent Deniau wrote on 07/10/04 :
Je parle chinois? relis ce que j'ai ecrit stp...


Il n'y a pas plus de "chinois" que d'"européen". Il faut préciser
(mandarain, cantonnais, ... il y a une soixantaine de langues en
Chine...)

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Laurent Deniau
Emmanuel Delahaye wrote:
Laurent Deniau wrote on 07/10/04 :

Je parle chinois? relis ce que j'ai ecrit stp...



Il n'y a pas plus de "chinois" que d'"européen". Il faut préciser
(mandarain, cantonnais, ... il y a une soixantaine de langues en Chine...)


Taratata.

http://www.tlfq.ulaval.ca/axl/asie/chine-4pol-chinois.htm
http://www.tlfq.ulaval.ca/axl/monde/index_langues-off.htm
http://atlasgeo.span.ch/htmlg/Chine.htm

Le chinois officiel est apparement le mandrarin.

a+, ld.


Avatar
Antoine Leca
En ck5uit$1a4$, Charlie Gordon va escriure:
Une nouvelle piste à explorer pour ce thread déjà bien fourni :

Pourrait-on utiliser le préprocesseur de cette facon (en excluant le
cas de la cross-compilation) ?

#if (2 << 15) == 0


Non (cf. Laurent. De plus rien ne t'assure, même hors compilation croisée,
que le préprocesseur a les mêmes propriétés d'entiers que la cible).


Mais continuez à chercher, les gars. Si quelqu'un trouve un moyen de passer
outre l'utilisation de <limits.h>, je suis preneur...


Antoine

Avatar
Emmanuel Delahaye
Laurent Deniau wrote on 08/10/04 :
Emmanuel Delahaye wrote:
Laurent Deniau wrote on 07/10/04 :

Je parle chinois? relis ce que j'ai ecrit stp...


Il n'y a pas plus de "chinois" que d'"européen". Il faut préciser
(mandarain, cantonnais, ... il y a une soixantaine de langues en Chine...)


Taratata.

http://www.tlfq.ulaval.ca/axl/asie/chine-4pol-chinois.htm
http://www.tlfq.ulaval.ca/axl/monde/index_langues-off.htm
http://atlasgeo.span.ch/htmlg/Chine.htm

Le chinois officiel est apparement le mandrarin.


La langue économique (Hong Kong, Canton) est le cantonnais...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"



Avatar
Antoine Leca
En , Emmanuel Delahaye va escriure:
Laurent Deniau wrote on 07/10/04 :
Je parle chinois? relis ce que j'ai ecrit stp...


Il n'y a pas plus de "chinois" que d'"européen".


En langue parlée, oui.
En langue écrite (ce qui est le cas ici), non.

Il faut préciser (mandarain, cantonnais, ... il y a une soixantaine
de langues en Chine...)


Il y a plus de langues que cela, mais elles ne s'écrivent pas toutes comme
le chinois. Par exemple, l'ouïghour est une langue complètement différente.

Je crois qu'il y a 8 dialectes (c'est comme cela que l'on les nomme
habituellement, même si c'est impropre) principaux, donc le mandarin (¾), le
wou, le cantonais, le min, le hakka.


Antoine


Avatar
Charlie Gordon
"Antoine Leca" wrote in message
news:ck63tm$9gm$

Mais continuez à chercher, les gars. Si quelqu'un trouve un moyen de
passer

outre l'utilisation de <limits.h>, je suis preneur...


La question de Vincent est comment faire pour éviter "configure" ou
similaire.
On peut donc utiliser <limits.h> et le preprocesseur:

#include <limits.h>

#if (INT_MAX >> 15) == 1
// on est en 16 bits
#elif (INT_MAX >> 31) == 1
// ici les int font 32 bits
#elif (INT_MAX >> 63) == 1
// super des gros int de 64 bits
#else
// toto, mais ou sommes nous ? plus au Kansas en tout cas.
#endif

C'est juste dommage qu'ils n'aient pas jugé utile de rajouter dans limits.h
des définitions pour le nombre de bits des différents types. Mais il est
vrai que rien n'oblige à ce que l'arithmétique se fasse en base 2.

Chqrlie

Avatar
Richard Delorme
"Antoine Leca" wrote in message
news:ck63tm$9gm$


Mais continuez à chercher, les gars. Si quelqu'un trouve un moyen de


passer

outre l'utilisation de <limits.h>, je suis preneur...



La question de Vincent est comment faire pour éviter "configure" ou
similaire.
On peut donc utiliser <limits.h> et le preprocesseur:

#include <limits.h>

#if (INT_MAX >> 15) == 1
// on est en 16 bits
#elif (INT_MAX >> 31) == 1
// ici les int font 32 bits
#elif (INT_MAX >> 63) == 1
// super des gros int de 64 bits
#else
// toto, mais ou sommes nous ? plus au Kansas en tout cas.
#endif


Ça ne marche pas, ça trouve toujours des int de 16 bits.

C'est juste dommage qu'ils n'aient pas jugé utile de rajouter dans limits.h
des définitions pour le nombre de bits des différents types. Mais il est
vrai que rien n'oblige à ce que l'arithmétique se fasse en base 2.


Si, en C, l'arithmétique entière est nécessairement en base 2. Par
contre il peut y avoir des bits de padding, ce qui complique le calcul
de la largeur d'un nombre entier.

--
Richard


Avatar
Antoine Leca
En ck698e$ssu$, Charlie Gordon va escriure:
La question de Vincent est comment faire pour éviter "configure" ou
similaire. On peut donc utiliser <limits.h>


Oui, cela je le sais.
Mais si on me trouve un moyen d'éviter la cascade de #elif, ce serait plus
joli...


C'est juste dommage qu'ils n'aient pas jugé utile de rajouter dans
limits.h des définitions pour le nombre de bits des différents types.


CHAR_BIT * sizeof(t), c'est pas bon pour toi ?

Ou alors tu veux le nombre de bits significatifs (sans le remplissage)? Pour
les non signés, tu peux le faire avec Umachin_MAX, mais c'est vrai que pour
les signés c'est plus taquin. Avec C99, on a la garantie que à partir de
machin_MAX tu peux calculer le nombre de bits de la partie positive, +1 pour
le bit de signe.

Bien sûr, tout ceci n'est pas disponible au niveau du préprocesseur. Là, il
faut se contenter de machin_MAX (ce qui est déjà ça).

Mais il est vrai que rien n'oblige à ce que l'arithmétique se fasse
en base 2.


Depuis C99, les seules représentations possibles pour les entiers sont
binaires (6.2.6.2); avec C90 c'est vrai que tu pouvais avoir d'autres
représentations, mais la pratique n'en a pas montré beaucoup...


Antoine

Avatar
Charlie Gordon
"Richard Delorme" wrote in message
news:4166b2ff$0$15753$
On peut donc utiliser <limits.h> et le preprocesseur:

#include <limits.h>

#if (INT_MAX >> 15) == 1
// on est en 16 bits
#elif (INT_MAX >> 31) == 1
// ici les int font 32 bits
#elif (INT_MAX >> 63) == 1
// super des gros int de 64 bits
#else
// toto, mais ou sommes nous ? plus au Kansas en tout cas.
#endif


Ça ne marche pas, ça trouve toujours des int de 16 bits.


C'est effectivement faux, mais je n'ai pas le même diagnostique : en
l'occurrence, ça trouve toujours le pays des merveilles !

Je me suis trompé sur le décalage, on pourra vérifier qu'il fallait écrire :

#include <stdio.h>
#include <limits.h>

int main(void) {
printf("INT_MAX = %d -> %sn", INT_MAX,
#if (INT_MAX >> 14) == 1
"on est en 16 bits"
#elif (INT_MAX >> 30) == 1
"ici les int font 32 bits"
#elif (INT_MAX >> 62) == 1
"super des gros int de 64 bits"
#else
"toto, mais ou sommes nous ? plus au Kansas en tout cas"
#endif
);
return 0;
}

désolé,

Chqrlie


Avatar
Charlie Gordon
"Antoine Leca" wrote in message
news:ck6d3g$nso$
En ck698e$ssu$, Charlie Gordon va escriure:
C'est juste dommage qu'ils n'aient pas jugé utile de rajouter dans
limits.h des définitions pour le nombre de bits des différents types.


CHAR_BIT * sizeof(t), c'est pas bon pour toi ?


Dans ce thread on veut faire des tests au niveau du préprocesseur ;-)

Chqrlie.

PS: C'est vrai que les cascades de #elif, c'est ni beau, ni exhaustif, mais
c'est quand même pas loin du but.