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?
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.
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.
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.
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.