Définir un entier 16 bits en C

Je dois déclarer un entier de la taille de 16 bits, en C.

Je sais que les tailles short et int dépendent de la machine.

J’ai essayé d’utiliser "stdint.h", mais il semble qu’ils le fassent simplement

 typedef short int16_t 

Donc ma question est:

Est-ce que je manque quelque chose et le type court garantit une longueur de 16 bits

Si non, existe-t-il une alternative qui la garantit?

    Cela signifie que int16_t est défini comme short sur votre machine, mais pas sur toutes les machines.

    Utilisez simplement int16_t où vous avez absolument besoin d’un type entier 16 bits; il sera défini comme approprié sur toutes les plates-formes qui fournissent stdint.h (ce qui devrait être tout ce qui supporte C99, ou cstdint pour C ++).

    [Éditer] Pour clarifier, le fichier d’en-tête ” stdint.h ” est fourni par le compilateur C (ou C ++), de sorte que son contenu variera vraisemblablement selon le compilateur, la version, le système, l’architecture de la CPU, etc. suite de compilateur savoir exactement quels types ont quelles tailles sur quels systèmes. L’examen de ce fichier sur un seul système vous renseigne uniquement sur les définitions d’une version particulière d’un compilateur sur un système d’exploitation donné sur une architecture particulière (par exemple, GCC 4.2 sur Darwin x86_64, ou Visual Studio sur WinNT Alpha ou ICC sur Solaris IA32. , etc). Certains systèmes, notamment ceux intégrés, peuvent avoir des tailles de types différentes. Par conséquent, un short peut ne pas toujours comporter 16 bits et le compilateur doit connaître la bonne taille à utiliser pour cette longueur de bits.

    Si vous examinez le fichier stdint.h sur un autre système, les définitions peuvent être différentes ou identiques, mais son objective est de fournir les définitions des types entiers de longueurs de bits garanties.

    Non, short ne garantit pas une longueur de 16 bits. Les seules garanties concernant les types de données entiers de base sont les suivantes:

    • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
    • sizeof(char) == 1 (note: un caractère peut encore contenir plus de 8 bits!)
    • SHRT_MIN <= -32767 et SHRT_MAX >= 32767 (implique que short est au moins 16 bits)
    • INT_MIN <= -32767 et INT_MAX >= 32767 (implique que int est au moins 16 bits)
    • LONG_MIN <= -2147483647 et LONG_MAX >= 2147483647 (implique que long est au moins 32 bits)
    • LLONG_MIN <= -9223372036854775807 et LLONG_MAX >= 9223372036854775807 (implique que long long correspond à au moins 64 bits)

    (C99 §5.2.4.2.1 et Annexe E)

    Le fait que short soit typé sur int16_t sur votre machine signifie simplement qu'un short est de 16 bits sur votre machine. Cela ne signifie pas que la définition sera la même sur les machines d'autres personnes (ou même sur d'autres compilations sur votre même machine).

    Si vous incluez , il définira int16_t d'une manière qui garantisse être d'un type signé et d'une largeur de 16 bits. Si vous avez besoin d’entiers de taille exacte, utilisez ces types.

    Chaque machine peut ou non disposer de ces définitions.

    Le seul moyen vraiment sûr de le faire est via un contrôle de configuration ou quelque chose de ce genre.

    Mais si int16_t existe (et que configure le trouve), il devrait s’agir d’un court-circuit sur les machines où un court est effectivement de 16 bits. Si un court est de taille différente, alors ce système définirait int16_t en quelque chose d’autre pour vous. En d’autres termes, si int16_t est disponible, vous pouvez supposer que sa longueur est de 2 octets.

    short est uniquement garanti pour avoir 16-bit largeur minimale de 16-bit .

    Il peut avoir 16-bit largeur de 16-bit sur votre système mais 32-bit dans un autre système.