Définir un nombre entier de 16 bits en C

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

je sais que les tailles courte et int dépendent de la machine.

j'ai essayé d'utiliser "stdint.h", mais il semble qu'ils n'ont tout 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, y a-t-il une alternative qui le garantit?

16
demandé sur sara 2012-03-22 01:37:12

4 réponses

cela signifie int16_t est définie comme short machine, pas toutes les machines.

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

[Edit] Pour préciser,"stdint.h " le fichier d'en-tête est fourni par le compilateur C (ou C++), de sorte que 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. Le fait de regarder 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 OS 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 différentes tailles, de sorte qu'un short peut ne pas être toujours 16 bits, et le compilateur connaîtrait la bonne taille à utiliser pour cette longueur de bits.

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 pour les types entiers de longueurs de bits garanties.

33
répondu maerics 2012-03-23 14:20:34

Non, short garantie de longueur 16 bits. Les seules garanties concernant les types de données de base integer sont:

  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • sizeof(char) == 1 (note:char pourrait encore être plus de 8 bits!)
  • SHRT_MIN <= -32767 et SHRT_MAX >= 32767 (implique short est d'au moins 16 bits)
  • INT_MIN <= -32767 et INT_MAX >= 32767 (implique int est d'au moins 16 bits)
  • LONG_MIN <= -2147483647 et LONG_MAX >= 2147483647 (implique long est au moins égale à 32 bits)
  • LLONG_MIN <= -9223372036854775807 et LLONG_MAX >= 9223372036854775807 (implique long long au moins 64 bits)

Le fait que short est tapé à int16_t machine signifie simplement qu'un short 16 bits sur de la machine. Cela ne signifie pas que la définition sera la même sur les machines des autres (ou même sur d'autres compile sur la même machine).

Si vous incluez <stdint.h>, il permettra de définir int16_t d'une certaine façon qui est garanti d'être un type qui est signé et 16 bits de large. Si vous avez besoin d'entiers de taille exacte, utilisez ces types de taille exacte.

9
répondu Adam Rosenfield 2012-03-21 21:48:17

chaque machine peut avoir ou ne pas avoir ces définitions disponibles.

le seul réel la façon sûre de le faire est via un contrôle de configuration ou quelque chose comme ça.

mais si int16_t existe (et configure le trouve) alors il devrait être un short sur les machines où un short est en effet 16 bits. Si un short est une taille différente, alors ce système définirait int16_t à quelque chose d'autre pour vous. IE, si int16_t est disponible, vous pouvez en toute sécurité supposer qu'il fait 2 octets de long.

3
répondu Wes Hardaker 2012-03-21 21:41:47

short n'est assuré d'être au moins 16-bit large.

C'est peut-être 16-bit large dans votre système, mais 32-bit dans un autre système.

2
répondu ouah 2012-03-21 21:54:35