Quand est u_int8_t ≠ unsigned char?
En fonction de C et de C++, CHAR_BIT >= 8
.
Mais à chaque fois que CHAR_BIT > 8
, uint8_t
ne peut même pas être représenté que 8 bits.
Il doit être plus grande, car CHAR_BIT
est le nombre minimum de bits pour n'importe quel type de données sur le système.
Sur ce genre de système peut uint8_t
être défini légalement être d'un type autre que unsigned char
?
(Si la réponse est différente pour le C et le C++ alors je voudrais savoir à la fois.)
- Je me demande si c'est légal d'avoir un
char
avec seulement 7 bits et 1 peu de rembourrage. - Nan, je pense que tous les
char
s doivent tout à leur représentation bits de participer à la détermination de leur valeur. - Ou peut-être une 16-bits
uint8_t
où 8 est réel et 8 est de rembourrage. Je voudrais tirer sur celui qui a fait un tel environnement. 🙂 - La norme C++ qu'il énumère, à titre d'option.
typedef signed integer type int8_t; // optional
- Pas sûr que ce soit autorisé, car la largeur est censé être exactement 8 bits. 😛
- est requise par la norme ont pas de rembourrage bits et à deux-compléter que si elle est signée.
- Ne serait-il pas perdre de gamme si ce qui s'est passé? Sens, vous avez besoin tous les 8 bits pour représenter certains
char
. - De tels environnements n'existe pas (il est commun pour les architectures DSP à être incapables de faire face à quelque chose de plus petit qu'un mot); dans ce cas,
uint8_t
ne devrait pas exister du tout. - Double Possible de u_int8_t vs unsigned char
Vous devez vous connecter pour publier un commentaire.
Si elle existe,
uint8_t
doit toujours avoir la même largeur queunsigned char
. Cependant, il n'a pas besoin d'être du même type; il peut être distinct étendu de type entier. Il a aussi besoin de ne pas avoir la même représentation queunsigned char
; par exemple, les bits peut être interprété dans le sens inverse. C'est un exemple stupide, mais il fait plus de sens pourint8_t
, oùsigned char
pourraient être celles de compléter ou de connexion de l'ampleur tandis queint8_t
est nécessaire pour être en complément à deux.Un autre "avantage" de l'aide d'un non-char étendu de type entier pour
uint8_t
même "normaux", des systèmes est C aliasing règles. Les types de caractères sont autorisés à alias quoi que ce soit, qui empêche le compilateur de lourdement l'optimisation de fonctions qui utilisent à la fois le caractère des pointeurs et des pointeurs vers d'autres types, à moins que lerestrict
mot-clé a été bien appliqué. Cependant, même siuint8_t
a exactement la même taille et de la représentation enunsigned char
, si la mise en œuvre fait distincte, non-type de caractère, l'aliasing règles ne s'appliqueraient pas à elle, et le compilateur peut faire l'hypothèse que les objets de typesuint8_t
etint
, par exemple, ne peut jamais, alias.uint8_t
doit être défini comme un typedef.typedef __uint8_t uint8_t;
est un typedef.long long
, il peut introduire unshort short
. Par conséquent,typedef short short int8_t;
...[u]int8_t
prolongation de types integer exactement à ce qu'il pourrait être optimisée de façon plus agressive ... mais finalement rejeté l'idée au motif que les programmeurs sont très susceptibles de s'attendre à avoir le même aliasing propriétéschar
. (C'était vers le même temps, on en avait crié par le noyau de gens pour le faire en fonction de leur type analyse d'alias tout, de sorte que nous étions tous un peu inquiet.)restrict
mot-clé, ou de copier le pointeur sur une variable locale dont l'adresse est jamais pris pour que le compilateur n'a pas besoin de s'inquiéter de savoir si leuint8_t
objets peuvent alias.En résumé,
uint8_t
ne peuvent être définis dans la loi sur les systèmes oùCHAR_BIT
est 8. C'est une unité adressable avec exactement la valeur 8 bits et pas de padding bits.Dans le détail,
CHAR_BIT
définit la largeur de la plus petite adressable unités, etuint8_t
ne peut pas avoir de remplissage bits; il ne peut exister que lorsque la plus petite unité adressable est exactement 8 bits de large. FournirCHAR_BIT
est de 8,uint8_t
peut être définie par une définition de type pour tout entier 8 bits non signé d'un type qui a pas de rembourrage bits.Voici ce que le projet de norme C11 (n1570.pdf) dit:
Ainsi les objets les plus petits doivent contenir exactement CHAR_BIT bits.
Ainsi, ceux qui sont les plus petites unités adressables. Évidemment
int8_t
etuint8_t
peut également être considérée comme la plus petite adressable unités, à condition qu'ils existent.L'accent sur la "Ces types sont facultatifs" est de moi. J'espère que cela a été utile 🙂
uint8_t
s'il n'est jamais différent deunsigned char
?int8
il ne serait pas compiler quandCHAR_BIT > 8
depuisint8_t
n'existerait même pas. Alors que si elle est utiliséechar
etCHAR_BIT > 8
, alors vous pourriez obtenir un demi-brisé construire.#if CHAR_BIT > 8... #error ZOMG... #endif
si votre programme est censé ne pas fonctionner pour ces systèmes?unsigned char
.unsigned char
l'existence est garantie, mais n'est garanti à 8 bits lorsqueCHAR_BIT == 8
.uint8_t
n'est pas garanti d'exister, mais elle est garantie 8 bits quand il ne.char
etint8_t
, en plus de la largeur. Unchar
peut utiliser ceux de compléter, en complément à deux ou signe et l'ampleur de la représentation, où unint8_t
est nécessaire d'utiliser une représentation en complément à deux.char
s.char
est la garantie d'avoirCHAR_BIT
bits et devis de la norme.Une possibilité que personne n'a jusqu'à présent mentionné: si
CHAR_BIT==8
et non qualifiéschar
est pas signé, que c'est dans quelques ABIs, puisuint8_t
pourrait être une définition de type pourchar
au lieu deunsigned char
. C'est important, au moins dans la mesure où elle affecte la surcharge de choix (et de son double maléfique, name mangling), c'est à dire si vous étiez à la foisfoo(char)
etfoo(unsigned char)
dans le champ d'application, l'appel defoo
avec un argument de typeuint8_t
préférezfoo(char)
sur un tel système.