Le Type à utiliser pour représenter un octet dans la norme ANSI (C89/90) C?
Est-il des normes plainte méthode pour représenter un octet dans la norme ANSI (C89/90) C? Je sais que, le plus souvent, un char qui arrive à être un octet, mais ma compréhension est que ce n'est pas garanti d'être le cas. Aussi, il est stdint.h dans le standard C99, mais ce qui a été utilisé avant C99?
Je suis curieux de savoir à la fois 8 bits spécifiquement, et un "octet" (sizeof(x) == 1).
- Assurez-vous de distinguer octet de octet. sizeof(char) = 1, ce qui signifie qu'un char est toujours un octet. Cependant, un octet n'est pas toujours un octet (DEC Alpha octets ont été 10 bits, autant que je me souvienne... octects sont définis à 8 bits).
Vous devez vous connecter pour publier un commentaire.
char
est toujours un octet , mais il n'est pas toujours une octet. Un octet est la plus petite unité adressable de la mémoire (dans la plupart des définitions), un octet de 8 bits de l'unité de mémoire.Qui est,
sizeof(char)
est toujours 1 pour toutes les implémentations, maisCHAR_BIT
macro danslimits.h
définit la taille d'un octet pour une plate-forme et il n'est pas toujours 8 bits. Il y a des plates-formes avec 16 bits et 32 bits des octets, doncchar
prendra plus de bits, mais il est encore un octet. Depuis la plage requise pourchar
est au moins de -127 à 127 (ou de 0 à 255), il sera au moins 8 bits sur toutes les plateformes.C'est moi qui souligne.
char
et être conforme, mais alors tous les grands types doivent occuper une partie intégrante (et alignés), le nombre de ces logiques octets (c'est à dire que vous ne pouvait pas avoir de 21 bits entier composé de matériel 3 octets, sauf si vous avez inclus un supplément de 7 bits de remplissage (le reste de la deuxièmechar
) avec elle.Vous pouvez toujours représenter un octet (si vous voulez dire 8bits) dans un unsigned char. C'est toujours au moins 8 bits, tous les bits qui composent la valeur, donc un 8 bits, la valeur sera toujours à adapter.
Si vous voulez exactement 8 bits, je pense aussi que vous aurez à utiliser la plate-forme dépendante des moyens. POSIX systèmes semblent être requis à l'appui de int8_t. Cela signifie que sur les systèmes POSIX, char (et donc un octet) est toujours en 8 bits.
Dans la norme ANSI C89/ISO C90 sizeof(char) == 1. Cependant, il n'est pas toujours le cas que 1 octet 8 bits. Si vous souhaitez compter le nombre de bits à 1 octet (et vous n'avez pas accès à des limites.h), je suggère ce qui suit:
Ici, nous utilisons Kernighan de la méthode pour compter le nombre de bits définis dans c. Pour mieux comprendre le code ci-dessus (ou en voir d'autres comme ça), je vous renvoie à "Peu Se Tourner Les Hacks".
(unsigned_type)-1
est toujours tous-ceux-bits dans le type de destination.Avant C99? Dépend de la plateforme de code.
Mais pourquoi s'en faire? Utilisez simplement stdint.h.
Dans chaque mise en œuvre de C que j'ai utilisé (de l'ancien UNIX incorporée compilateurs écrit par les ingénieurs de matériel pour gros vendeur de compilateurs)
char
a toujours été de 8 bits.Vous pouvez trouver à peu fiables, les macros et les typedefs en boost.
Je remarque que certains ont répondu ont redéfini le mot octet pour signifier quelque chose d'autre que de 8 bits.
Un octet de 8 bits, cependant, dans certaines implémentations c char est de 16 bits (2 octets) ou 8 bits (1 octet). Les personnes qui demandent un octet "plus petite unité adressable de mémoire" ou de certaines de ces ordures ont perdu la compréhension de la signification de l'octet (8 bits).
La raison pour laquelle certaines implémentations de C 16 bits caractères (2 octets) et certains ont des caractères 8 bits (1 octet), et il n'y a pas de type standard, appelé "octet", est dû à la paresse.
Donc, nous devrions utiliser int_8
int8_t
est nécessaire, si elle existe, ne pas avoir de rembourrage bits (et le complément à deux de la représentation), de sorte que la seule façon dont il peut exister, c'est sichar
est exactement 8 bits.