web-dev-qa-db-fra.com

Définir un entier 16 bits en C

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

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

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

typedef short int16_t

Ma question est donc:

Suis-je en train de manquer quelque chose et le type court garantit une longueur de 16 bits?

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

17
sara

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

Utilisez simplement le 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 (qui devrait être tout ce qui supporte C99, ou cstdint pour C++).

[Modifier] Pour clarifier, le "stdint.h "le fichier d'en-tête est fourni par le compilateur C (ou C++), donc son contenu variera probablement par compilateur, version, système, architecture CPU, etc. Autrement dit, les auteurs de la suite de compilateurs savent exactement quels types ont quelles tailles sur quels systèmes. L'examen de ce fichier sur un seul système ne vous renseigne que sur les définitions d'une version particulière d'un compilateur particulier sur un système d'exploitation particulier 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, en particulier ceux intégrés, peuvent avoir des tailles de type différentes, donc un short peut ne pas toujours être de 16 bits, et le compilateur connaîtra la bonne taille à utiliser pour cette longueur de bit .

Si vous regardez le fichier stdint.h sur un autre système, les définitions peuvent être différentes, ou elles peuvent être les mêmes - mais son but est de fournir les définitions des types entiers de longueurs de bits garanties.

33
maerics

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

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1 (remarque: un char peut toujours être supérieur à 8 bits!)
  • SHRT_MIN <= -32767 et SHRT_MAX >= 32767 (implique que short est d'au moins 16 bits)
  • INT_MIN <= -32767 et INT_MAX >= 32767 (implique que int est d'au moins 16 bits)
  • LONG_MIN <= -2147483647 et LONG_MAX >= 2147483647 (implique long est au moins 32 bits)
  • LLONG_MIN <= -9223372036854775807 et LLONG_MAX >= 9223372036854775807 (implique long long est d'au moins 64 bits)

(C99 §5.2.4.2.1 et annexe E)

Le fait que short soit typé par int16_t sur votre machine signifie simplement qu'un short est 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 <stdint.h>, il définira int16_t d'une manière qui est garantie comme étant un type signé et d'une largeur de 16 bits. Si vous avez besoin d'entiers de taille exacte, utilisez ces types de taille exacte.

9
Adam Rosenfield

Chaque machine peut ou non avoir ces définitions disponibles.

Le seul réel moyen sûr de le faire est via une vérification de configuration ou quelque chose.

Mais si int16_t existe (et configure le trouve), il devrait s'agir d'un court-circuit sur les machines où un court-circuit est en effet de 16 bits. Si un court est d'une taille différente, alors ce système définirait int16_t pour autre chose pour vous. IE, si int16_t est disponible, vous pouvez supposer qu'il est long de 2 octets.

3
Wes Hardaker

short n'est garanti qu'au moins 16-bit large.

Ça peut être 16-bit large dans votre système mais 32-bit dans un autre système.

2
ouah