On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
Marc Espie a écrit :On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
Et plus proche de nous, Windows en 64-bit.
Marc Espie a écrit :
On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
Et plus proche de nous, Windows en 64-bit.
Marc Espie a écrit :On a tous deja rencontre des archi ou sizeof(int) = sizeof(long).
Et plus proche de nous, Windows en 64-bit.
Pierre Maurette a écrit :Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater than
the rank of short int, which shall be greater than the rank of signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition de
l'opérateur sizeof.
Oui, j'ai bien vu cela mais je ne vois pas en quoi cela contraint par exemple à
avoir :
sizeof(short) <= sizeof(int)
range(type) et sizeof(type) étant des choses différentes s'il y a du padding par
exemple.
J'ai du mal à trouver sur Usenet des infos _explicites_ sur cette question
Pierre Maurette a écrit :
Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater than
the rank of short int, which shall be greater than the rank of signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition de
l'opérateur sizeof.
Oui, j'ai bien vu cela mais je ne vois pas en quoi cela contraint par exemple à
avoir :
sizeof(short) <= sizeof(int)
range(type) et sizeof(type) étant des choses différentes s'il y a du padding par
exemple.
J'ai du mal à trouver sur Usenet des infos _explicites_ sur cette question
Pierre Maurette a écrit :Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater than
the rank of short int, which shall be greater than the rank of signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition de
l'opérateur sizeof.
Oui, j'ai bien vu cela mais je ne vois pas en quoi cela contraint par exemple à
avoir :
sizeof(short) <= sizeof(int)
range(type) et sizeof(type) étant des choses différentes s'il y a du padding par
exemple.
J'ai du mal à trouver sur Usenet des infos _explicites_ sur cette question
Le Tue, 21 Jul 2009 07:11:07 +0200
Pierre Maurette a écritcandide, le 21/07/2009 a écrit :Bonjour,
J'ai lu ici même que : sizeof (short) <= sizeof (int) et de même que
sizeof (int) < sizeof (long).
Je ne pense pas que le int soit obligatoirement *strictement* moins
large que le long. Simplement s'il y a égalité, ça impose que int soit
sur au moins 32 bits, INT_MAX == LONG_MAX >= 0x7FFFFFFJ'ai beau lire et relire la Norme, je ne vois pas où cela est garanti.
Quelqu'un peut-il préciser ? Merci
Il me semble que c'était explicite dans la version précédente de la
norme C, à moins que ce ne soit dans celle de C++. Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater
than the rank of short int, which shall be greater than the rank of
signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition
de l'opérateur sizeof.
Bah le compilateur fait ce qui lui chante à mon avis.
Rien à priori n'interdit que
sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 et que tout ce
petit monde soit un 32 bit sur un machine 32 bits (i.e. soit
représenté par un type unique en interne).
Du moment qu'il sait caster correctement (unsigned char) 0xFFFFab en
0xab (car la norme dit UCHAR_MAX = 0xFF) et des choses de ce genre, ça
suffit.
Seules les limites min, max et umax sont imposées (dans <limits.h>),
Du coup, les concepteurs ont fait rimer limits.h avec la taille
utilisée en interne pour la représentation pour plus de simplicité et
de bon sens, mais à mon avis rien n'est imposée par la norme à ce
niveau.
Le Tue, 21 Jul 2009 07:11:07 +0200
Pierre Maurette a écrit
candide, le 21/07/2009 a écrit :
Bonjour,
J'ai lu ici même que : sizeof (short) <= sizeof (int) et de même que
sizeof (int) < sizeof (long).
Je ne pense pas que le int soit obligatoirement *strictement* moins
large que le long. Simplement s'il y a égalité, ça impose que int soit
sur au moins 32 bits, INT_MAX == LONG_MAX >= 0x7FFFFFF
J'ai beau lire et relire la Norme, je ne vois pas où cela est garanti.
Quelqu'un peut-il préciser ? Merci
Il me semble que c'était explicite dans la version précédente de la
norme C, à moins que ce ne soit dans celle de C++. Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater
than the rank of short int, which shall be greater than the rank of
signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition
de l'opérateur sizeof.
Bah le compilateur fait ce qui lui chante à mon avis.
Rien à priori n'interdit que
sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 et que tout ce
petit monde soit un 32 bit sur un machine 32 bits (i.e. soit
représenté par un type unique en interne).
Du moment qu'il sait caster correctement (unsigned char) 0xFFFFab en
0xab (car la norme dit UCHAR_MAX = 0xFF) et des choses de ce genre, ça
suffit.
Seules les limites min, max et umax sont imposées (dans <limits.h>),
Du coup, les concepteurs ont fait rimer limits.h avec la taille
utilisée en interne pour la représentation pour plus de simplicité et
de bon sens, mais à mon avis rien n'est imposée par la norme à ce
niveau.
Le Tue, 21 Jul 2009 07:11:07 +0200
Pierre Maurette a écritcandide, le 21/07/2009 a écrit :Bonjour,
J'ai lu ici même que : sizeof (short) <= sizeof (int) et de même que
sizeof (int) < sizeof (long).
Je ne pense pas que le int soit obligatoirement *strictement* moins
large que le long. Simplement s'il y a égalité, ça impose que int soit
sur au moins 32 bits, INT_MAX == LONG_MAX >= 0x7FFFFFFJ'ai beau lire et relire la Norme, je ne vois pas où cela est garanti.
Quelqu'un peut-il préciser ? Merci
Il me semble que c'était explicite dans la version précédente de la
norme C, à moins que ce ne soit dans celle de C++. Dans la C99 que j'ai
sous les yeux, si on veut prouver, on doit pouvoir passer par 6.3.1.1
(définition de /integer conversion rank/), en particulier:
<CIT>
- The rank of a signed integer type shall be greater than the rank of
any signed integer type with less precision.
- The rank of long long int shall be greater than the rank of long int,
which shall be greater than the rank of int, which shall be greater
than the rank of short int, which shall be greater than the rank of
signed char.
</CIT>
Ensuite on fait la relation entre le /rank/ et le /range/ en 6.2.5.8,
puis on regarde la représentation des types en 6.2.6 et la définition
de l'opérateur sizeof.
Bah le compilateur fait ce qui lui chante à mon avis.
Rien à priori n'interdit que
sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 et que tout ce
petit monde soit un 32 bit sur un machine 32 bits (i.e. soit
représenté par un type unique en interne).
Du moment qu'il sait caster correctement (unsigned char) 0xFFFFab en
0xab (car la norme dit UCHAR_MAX = 0xFF) et des choses de ce genre, ça
suffit.
Seules les limites min, max et umax sont imposées (dans <limits.h>),
Du coup, les concepteurs ont fait rimer limits.h avec la taille
utilisée en interne pour la représentation pour plus de simplicité et
de bon sens, mais à mon avis rien n'est imposée par la norme à ce
niveau.
Si cela te tracasses, il faut faire un rapport d'anomalie (defect
report) auprès du comité, afin que ce point soit clarifié le plus tôt
possible (ce qui correspondra avec la prochaine révision de la norme).
Si cela te tracasses, il faut faire un rapport d'anomalie (defect
report) auprès du comité, afin que ce point soit clarifié le plus tôt
possible (ce qui correspondra avec la prochaine révision de la norme).
Si cela te tracasses, il faut faire un rapport d'anomalie (defect
report) auprès du comité, afin que ce point soit clarifié le plus tôt
possible (ce qui correspondra avec la prochaine révision de la norme).
| *) d'une part, je ne suis pas certain qu'il y ait besoin de clarification ; on
| N'a certes PAS en théorie
|
| sizeof(short) <= sizeof(int)
Les règles de promotions promotent 'short' en 'int'.
promotion int -> long.
Tu as toujours sizeof (char) <= sizeof (T)
où T est n'importe quel type de donnée complet.
| *) d'une part, je ne suis pas certain qu'il y ait besoin de clarification ; on
| N'a certes PAS en théorie
|
| sizeof(short) <= sizeof(int)
Les règles de promotions promotent 'short' en 'int'.
promotion int -> long.
Tu as toujours sizeof (char) <= sizeof (T)
où T est n'importe quel type de donnée complet.
| *) d'une part, je ne suis pas certain qu'il y ait besoin de clarification ; on
| N'a certes PAS en théorie
|
| sizeof(short) <= sizeof(int)
Les règles de promotions promotent 'short' en 'int'.
promotion int -> long.
Tu as toujours sizeof (char) <= sizeof (T)
où T est n'importe quel type de donnée complet.
on N'a certes PAS en théorie
sizeof(short) <= sizeof(int)
mais ça ne semble pas vraiment gênant puisqu'en pratique c'est visiblement
TOUJOURS réalisé
Par contre, OUI, ce qui me tracasse c'est d'avoir lu de façon répétée sur ce
forum et sur son homologue anglophone qu'on avait :
sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
et ceci affirmé par des personnes qui ont de toute évidence une très grande
expérience de la programmation C
on N'a certes PAS en théorie
sizeof(short) <= sizeof(int)
mais ça ne semble pas vraiment gênant puisqu'en pratique c'est visiblement
TOUJOURS réalisé
Par contre, OUI, ce qui me tracasse c'est d'avoir lu de façon répétée sur ce
forum et sur son homologue anglophone qu'on avait :
sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
et ceci affirmé par des personnes qui ont de toute évidence une très grande
expérience de la programmation C
on N'a certes PAS en théorie
sizeof(short) <= sizeof(int)
mais ça ne semble pas vraiment gênant puisqu'en pratique c'est visiblement
TOUJOURS réalisé
Par contre, OUI, ce qui me tracasse c'est d'avoir lu de façon répétée sur ce
forum et sur son homologue anglophone qu'on avait :
sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
et ceci affirmé par des personnes qui ont de toute évidence une très grande
expérience de la programmation C
Quel est le problème ? S'ils ont une très grande expérience, et qu'ils ont
toujours vu qu'en pratique c'est vrai, pourquoi ne l'affirmeraient-ils
pas ?
Quel est le problème ? S'ils ont une très grande expérience, et qu'ils ont
toujours vu qu'en pratique c'est vrai, pourquoi ne l'affirmeraient-ils
pas ?
Quel est le problème ? S'ils ont une très grande expérience, et qu'ils ont
toujours vu qu'en pratique c'est vrai, pourquoi ne l'affirmeraient-ils
pas ?