Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Types entiers

7 réponses
Avatar
Marc Lasson
Bonjour,

J'ai quelques questions sur les types entiers:
- Comment peut-on, à la compilation, vérifier si un intN_t est défini ?

#ifndef INT24_MAX
#error int24_t n est pas defini
#endif

Ca ne me parait pas raisonnable.

- Est-ce qu'il est possible que "int8_t" soit défini sur un système où
CHAR_BITS est différent de 8 ?

- Si oui, comment peut-on allouer un tableau de 17 int8_t ?

Merci,

--
Marc.

7 réponses

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Marc Lasson wrote:

- Est-ce qu'il est possible que "int8_t" soit défini sur un système



Je ne crois pas. Les formats fixes sont optionnels. Ils sont définis par la
norme, mais pas imposés par la norme. (Encore un cas typique de code standard
non portable!)

CHAR_BITS est différent de 8 ?

- Si oui, comment peut-on allouer un tableau de 17 int8_t ?


Je ne vois pas trop à quoi servent ces types de taille fixe...

Tu demandes un tableau de 17 unsigned char, tu les auras toujours, sur
n'importe quelle machine. Les unsigned char feront au moins 8 bits. Si il
font plus, ça ne dérange personne (à part qu'on a le sentiment de perdre de
la place, mais comme le montre l'architecture des DSP les plus courants, il
est difficile de concilier rapidité et optimisation de la mémoire).

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Emmanuel Delahaye wrote:

Tu demandes un tableau de 17 unsigned char, tu les auras toujours, sur
n'importe quelle machine. Les unsigned char feront au moins 8 bits. Si
il font plus, ça ne dérange personne (à part qu'on a le sentiment de
perdre de la place, mais comme le montre l'architecture des DSP les plus
courants, il est difficile de concilier rapidité et optimisation de la
mémoire).


Illustration:

/********************************************************************/
/* LIMITS.H v3.10 */
/* Copyright (c) 1993-1998 Texas Instruments Incorporated */
/********************************************************************/
#ifndef _LIMITS
#define _LIMITS

#define CHAR_BIT 16 /* NUMBER OF BITS IN TYPE CHAR */
#define SCHAR_MAX 32767 /* MAX VALUE FOR SIGNED CHAR */
#define SCHAR_MIN (-SCHAR_MAX-1) /* MIN VALUE FOR SIGNED CHAR */
#define UCHAR_MAX 65535u /* MAX VALUE FOR UNSIGNED CHAR */
#define CHAR_MIN SCHAR_MIN /* MIN VALUE FOR CHAR */
#define CHAR_MAX SCHAR_MAX /* MAX VALUE FOR CHAR */
#define MB_LEN_MAX 1

#define SHRT_MAX 32767 /* MAX VALUE FOR SHORT */
#define SHRT_MIN (-SHRT_MAX-1) /* MIN VALUE FOR SHORT */
#define USHRT_MAX 65535u /* MAX VALUE FOR UNSIGNED SHORT */

#define INT_MAX 32767 /* MAX VALUE FOR INT */
#define INT_MIN (-INT_MAX-1) /* MIN VALUE FOR INT */
#define UINT_MAX 65535u /* MAX VALUE FOR UNSIGNED INT */

#define LONG_MAX 2147483647 /* MAX VALUE FOR LONG */
#define LONG_MIN (-LONG_MAX-1) /* MIN VALUE FOR LONG */
#define ULONG_MAX 4294967295 /* MAX VALUE FOR UNSIGNED LONG */

#endif


--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Alexandre BACQUART
Emmanuel Delahaye wrote:

Je ne vois pas trop à quoi servent ces types de taille fixe...


Je pense que ce sont des types bas-niveau qui manquaient à C dans le cas
où l'on veut forcer le compilateur à ne traiter que X bits sur une
achitecture capable de traiter des entiers de X bits, mais sur laquelle
int_leastX_t est susceptible d'avoir une taille supérieure (est-ce
possible ?). Sinon je ne vois pas pourquoi ils auraient été rajoutés...

C'est de la pûre économie de mémoire dans un contexte bas-niveau où
l'objectif de portabilité 100% est de toutes façons perdu d'avance.
M'enfin bon, il est vrai que de simples typedefs peuvent les remplacer...

Au passage, pendant qu'on y est, y a-t-il d'autres types dans <stdint.h>
qui ne sont pas imposés par la norme ?


--
Tek

Avatar
Antoine Leca
En 40f0543c$0$12202$, Alexandre BACQUART va escriure:
Au passage, pendant qu'on y est, y a-t-il d'autres types dans
<stdint.h> qui ne sont pas imposés par la norme ?


Tout plein. Par exemple, uint_least2591_t.


Antoine

Avatar
Antoine Leca
En 40efe2eb$0$12197$, Marc Lasson va escriure:
J'ai quelques questions sur les types entiers:
- Comment peut-on, à la compilation, vérifier si un intN_t est défini


#define INTn_EST_DEFINI INTn_MIN
#include <stdint.h>

/*...*/
#ifdef INTn_EST_DEFINI


#ifndef INT24_MAX
#error int24_t n est pas defini
#endif

Ca ne me parait pas raisonnable.


En quoi ?
Sinon, à quoi servirait cette constante ?


- Est-ce qu'il est possible que "int8_t" soit défini sur un système où
CHAR_BITS est différent de 8 ?


Je ne pense pas: la définition de CHAR_BIT est « le nombre de bits dans le
plus petit objet (qui ne soit pas un champ de bits) », avec comme contrainte
complémentaire d'être supérieur à 8.

Si int8_t était possible, il y aurait contradiction.



Antoine

Avatar
Alexandre BACQUART
Antoine Leca wrote:

En 40f0543c$0$12202$, Alexandre BACQUART va escriure:

Au passage, pendant qu'on y est, y a-t-il d'autres types dans
<stdint.h> qui ne sont pas imposés par la norme ?


Tout plein. Par exemple, uint_least2591_t.


Quel est le sens caché ? Que la norme ne se risquera jamais à imposer
un entier de X bits (ou au minimum) ?


--
Tek


Avatar
Antoine Leca
En 40f2b65c$0$15314$, Alexandre BACQUART va escriure:
Antoine Leca wrote:

En 40f0543c$0$12202$, Alexandre BACQUART va
escriure:

Au passage, pendant qu'on y est, y a-t-il d'autres types dans
<stdint.h> qui ne sont pas imposés par la norme ?


Tout plein. Par exemple, uint_least2591_t.


Quel est le sens caché ?


<stdint.h> et <inttypes.h> sont une aide au portage de certains types de
programmes (interfaçage). En ce sens, ils héritent des contraintes générales
de la norme, comme par exemple le fait que la norme n'oblige pas les char à
faire 8 bits, ni les long 32, etc. En résumé, rien n'est imposé.

[ En fait si: sur une machine en complément à 2 organisée "classiquement"
sur une base 8/16/32 bits, les types [u]int8/16/32/64_t doivent être
définis. Cela couvre l'utilisation "classique" de <inttypes.h>, donc
améliore le spectre d'utilisation. ]


Que la norme ne se risquera jamais à imposer
un entier de X bits (ou au minimum) ?


Comprend pas.