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
Antoine Leca
En 20041008161305$, Vincent Lefevre va escriure:
Surtout que mon code est déjà dans un #define, et des #if ... dans
un #define, ça ne me semble pas possible.


Cela s'écrit ?


Depuis C99, les seules représentations possibles pour les entiers
sont binaires (6.2.6.2);


Ils ont gardé les représentation en complément à 1 et en signe +
valeur absolue. Il y a une raison? Est-ce que c'est utilisé quelque
part?


Oui, dans certains dinosaures de chez Unisys, à ce qu'il paraît, qui ont des
compilos C ANSI. Je suis trop jeune et trop pauvre pour avoir accès à ces
machines, cependant.


Antoine


Avatar
Antoine Leca
En 20041008164722$, Vincent Lefevre va escriure:

Le problème est que tu supposes ici que toutes les expressions
constantes sont évaluées à la traduction.


Non. Je suppose qu'elles sont évaluables, et que l'évaluation de celles qui
en contrôlent d'autres n'aboutit pas à des comportements indéfinis (sinon,
bien sûr, le comportement est indéfini, comme dans static i=1/0;)

Dans 2 || 1 / 0, le
compilateur peut très bien choisir d'évaluer le || à l'exécution,



Admettons.

et de ne considérer que l'expression constante 1 / 0 à évaluer à
la traduction


Non. Tu sautes le lien de causalité (les points de séquence).


Antoine

Avatar
Vincent Lefevre
Dans l'article <ck3thv$36r$,
Laurent Deniau écrit:

Vincent Lefevre wrote:
Je te retourne la question. Pourquoi utiliser unsigned long long?


Pour avoir au moins 64 bits (mais j'utilise plutôt les types de
<stdint.h>). Eh oui, 32 bits, ça peut ne pas être suffisant. D'où
l'idée du type générique.


Tu travailles sur une archi ou tu peux indexer un tableau (ou un
segment) sur 64 bits et ou un long ne fait pas 64 bits?


Mon index_t n'indexe pas un tableau (il n'y a pas que les tableaux
qu'on peut indexer).

[...]

index_t ne sert-il pas a indexer un tableau?


C'est ici un entier qui donne une position sur un segment (plus
ou moins une abscisse relative, et qui peut aussi être vu comme
un indice dans un groupe).


Alors je ne comprends pas ton besoin. Si c'est effectivement un offset
dans un segment, ca doit tenir dans un registre, donc dans un long.


Ce n'est pas un offset, mais une position. Un segment, ça a une
infinité de points, il y a donc une infinité de positions possibles.
L'entier est un index r qui donne une abscisse de valeur r * a mod k,
où a et k sont des constantes. Dans l'étude mathématique, r est
potentiellement infini, mais dans l'algorithme en pratique, il est
borné en fonction de paramètres fournis par l'utilisateur.

--
Vincent Lefèvre - 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



Avatar
Vincent Lefevre
Dans l'article <ck6h7v$bnh$,
Antoine Leca écrit:

En 20041008162131$, Vincent Lefevre va escriure:
Par exemple, si on considère k || 1 / 0 (j'ai pris volontairement
quelque chose qui n'était pas constant devant le ||),


Soit k est constant (évaluable pendant la traduction), et alors le fait de
cacher une constante derrière un identificateur ne fait que compliquer la
discussion.

Soit il n'est pas constant, et on est hors du cadre.


Pourquoi hors du cadre?

Le verset 11 dit:

[#11] The semantic rules for the evaluation of a constant
expression are the same as for nonconstant expressions.88)

La règle sémantique de l'évaluation de 1 / 0 est comme celle d'une
expression non constante, donc ici, comportement indéfini.


Et pour que l'expression puisse être une expression constante, k
doit être constant; c'est donc parfaitement décidable pour le
compilateur.


Non, k n'a pas besoin d'être constant. La norme n'impose aucune
contrainte sur ce qui entoure une expression pour considérer
celle-ci comme constante ou non.

Tu te mords la queue dans ton explication: tu dis que les
expressions non constantes n'ont pas de problèmes, seules les
expressions constantes posent problème;


Je n'ai pas dis ça. Certaines expressions non constantes ont un
comportement indéfini, et d'autres non.

hors tu concèdes que les expressions constantes s'évaluent selon les
règles des expressions non constantes (qui ne posent pas de
problème);


Ben non, les expressions non constantes peuvent avoir un comportement
indéfini.

pourtant tu vois un problème...


Il y a effectivement problème avec ce que dit strictement la norme.

--
Vincent Lefèvre - 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


Avatar
Vincent Lefevre
Dans l'article <ck6hsv$e0i$,
Antoine Leca écrit:

En 20041008164722$, Vincent Lefevre va escriure:

et de ne considérer que l'expression constante 1 / 0 à évaluer à
la traduction


Non. Tu sautes le lien de causalité (les points de séquence).


Donc tu dis que dans le bout de programme suivant, 1.1 + 2.0 ne
doit pas être évalué à la traduction, parce qu'on saute le lien
de causalité (en effet, rien ne dit a priori si test() va être
exécuté dans le programme). C'est bien ça?

int test(void)
{
return 1.1 + 2.0;
}

--
Vincent Lefèvre - 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


Avatar
James Kanze
Gabriel Dos Reis writes:

|> Une optimisation ne change pas le fonctionnement observable.

Une optimisation peut très bien changer le fonctionnement observable,
dans la mésure que le nouveau fonctionnement est aussi conforme.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
"Antoine Leca" writes:

|> 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...

Que veut dire la phrase « The representations of integral types shall
define values by use of a pure binary numeration system" alors. (C'est
dans le paragraphe 13 de §6.1.2.5.)

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
James Kanze
"Antoine Leca" writes:

|> Oui, dans certains dinosaures de chez Unisys, à ce qu'il paraît, qui
|> ont des compilos C ANSI. Je suis trop jeune et trop pauvre pour
|> avoir accès à ces machines, cependant.

Certains de ces dinosaures (avec des int de 36 bits, complément à 1)
sont encore fabriqués aujourd'hui. D'autres (avec des int de 48 bits,
dont 8 bits de rembourrage, magnitude signé) n'ont sorti de la
production que depuis quelques années, et se trouvent encore par ce et
par là.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
Vincent Lefevre
Dans l'article ,
James Kanze écrit:

Gabriel Dos Reis writes:

|> Une optimisation ne change pas le fonctionnement observable.

Une optimisation peut très bien changer le fonctionnement observable,
dans la mésure que le nouveau fonctionnement est aussi conforme.


et également quand il y a du comportement indéfini (comme lire une
variable non initialisée).

--
Vincent Lefèvre - 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

Avatar
Gabriel Dos Reis
Vincent Lefevre <vincent+ writes:

| Dans l'article ,
| Gabriel Dos Reis écrit:
|
| > Vincent Lefevre <vincent+ writes:
|
| > | Dans l'article ,
| > | Gabriel Dos Reis écrit:
| > |
| > | > Vincent Lefevre <vincent+ writes:
| > |
| > | > | Dans l'article <cjvbua$f0p$,
| > | > | Charlie Gordon écrit:
| > |
| > | > | > 1 ? 0 : 1>>32
| > | > |
| > | > | L'implémentation peut ne pas évaluer 1>>32. Mais elle peut aussi
| > | > | l'évaluer en tant que sous-expression constante (sans chercher à
| > | > | savoir si la valeur pourra être utilisée ou si elle ne sera jamais
| > | > | utilisée), et dans ce cas, il y a comportement indéfini.
| > |
| > | > Bah non ; ce n'est pas un comportement possible de la machine
| > | > abstraite.
| > |
| > | Sur quoi tu te bases?
|
| > Le machin que tu cites à tout le monde.
|
| Ça ne dit pas que ce n'est pas un comportement possible de la machine
| abstraite.

Bah si.

Si la machine abstraite ne l'évalue pas, alors tu ne peux pas l'observer.

-- Gaby