Je vais répondre à vos questions dans l'ordre inverse.
La norme de préciser si ce type peuvent ou pourront être un type de caractère?
Réponse courte: int8_t
est signed char
dans la plupart des plates-formes populaires (GCC/Intel/Clang sur Linux et Visual Studio sous Windows), mais peut-être autre chose dans d'autres.
La réponse longue suit.
Section 18.4.1 du C++11 Norme fournit le synopsis de l' <cstdint>
qui comprend les éléments suivants
typedef
entier signé de type int8_t; //optional
Plus loin dans le même article, à l'alinéa 2, il est dit
L'en-tête [<cstdint>
] définit toutes les fonctions, les types et les macros le même que 7.18 dans le C standard.
où C norme C99 comme par 1.1/2:
C ++ est un langage de programmation basé sur le langage de programmation C, comme décrit dans la norme ISO/IEC 9899:1999 langages de Programmation - C (ci-après dénommé le C standard).
Par conséquent, la définition de l' int8_t
se trouve dans la Section 7.18 du standard C99. Plus précisément, C99 Section 7.18.1.1 dit
L' typedef
nom intN_t
désigne un entier signé de type avec une largeur de N
, pas de rembourrage bits, et un complément à deux de la représentation. Ainsi, int8_t désigne un entier signé de type avec une largeur de 8 bits.
En outre, la C99 de la Section 6.2.5/4 dit
Il y a cinq standard signé les types integer, désigné comme signed char, short int, int, long intet long long int. (Ces et d'autres types peuvent être désignés dans plusieurs autres manières, comme décrit dans 6.7.2.) Il peut également être mise en œuvre définies par l'étendue entier signé types. Le standard et étendue entier signé types sont collectivement appelés entier signé types.
Enfin, C99 Section 5.2.4.2.1 impose des tailles minimales de la norme entier signé types. À l'exclusion signed char
, toutes les autres sont au moins 16 bits.
Par conséquent, int8_t
est soit signed char
ou 8 bits étendu (non standard) signé de type entier.
Les deux glibc (la bibliothèque C de GNU) et Visual Studio C de la bibliothèque de définir int8_t
comme signed char
. Intel et Clang, au moins sur Linux, aussi l'utilisation de la libc, et donc, la même chose s'applique à eux. Par conséquent, dans la plus populaire des plateformes int8_t
est signed char
.
Compte tenu de cette C++11 programme, dois-je m'attendre à voir un certain nombre ou une lettre? Ou ne pas faire hauteur des attentes?
Réponse courte: Dans la plupart des plates-formes populaires (GCC/Intel/Clang sur Linux et Visual Studio sous Windows), vous allez certainement voir la lettre 'A'. En d'autres plates-formes que vous pouvez obtenir de voir 65
. (Grâce à la Dpj pour le rappeler à moi.)
Dans la suite, toutes les références sont pour le C++11 standard (projet actuel, N3485).
L'article 27.4.1 fournit le synopsis de l' <iostream>
, en particulier, il dispose de la déclaration d' cout
:
extern ostream cout;
Maintenant, ostream
est typedef
pour un modèle de spécialisation de l' basic_ostream
conformément à l'Article 27.7.1:
template <class charT, class traits = char_traits<charT> >
class basic_ostream;
typedef basic_ostream<char> ostream;
Section 27.7.3.6.4 fournit la déclaration suivante:
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, signed char c);
Si int8_t
est signed char
alors c'est cette surcharge qui va être appelé. Le même article précise également que l'effet de cet appel est de l'impression du caractère (pas le nombre).
Maintenant, considérons le cas où l' int8_t
est une extension de type entier signé. Évidemment, la norme ne spécifie pas les surcharges d' operator<<()
pour les types, mais grâce à des promotions et des conversions l'une des surcharges peut accepter l'appel. En effet, int
d'au moins 16 bits de long et peut représenter toutes les valeurs de int8_t
. Puis de 4,5/1 donne que l' int8_t
peut être promu à l' int
. D'autre part, de 4,7/1 et 4,7/2 donne qu' int8_t
peut être converti à l' signed char
. Enfin, 13.3.3.1.1 rendements que la promotion est favorisée par rapport à la conversion au cours de la résolution de surcharge. Par conséquent, la surcharge suivante (déclarée dans 23.7.3.1)
basic_ostream et basic_ostream::operator<<(int n);
sera appelée. Cela signifie que, de ce code
int8_t i = 65;
std::cout << i;
imprime 65
.
Mise à jour:
1. Corrigé le post suivant Dpj's commentaire.
2. Ajouté les commentaires suivants sur la possibilité d' int8_t
être typedef
pour char
.
Comme l'a dit, le standard C99 (Section 6.2.5/4 cité ci-dessus) définit 5 standard des entiers signés types (char
n'est pas l'un d'eux) et permet des implémentations pour ajouter leur onw qui sont visés en tant que non-standard des entiers signés types. La norme C++ renforce cette définition dans la Section 3.9.1/2:
Il y a cinq standard signé types d'entiers : "signed char", "short int", "int", "long int" et "long long int" [...] Il peut également être mise en œuvre définies par l'étendue entier signé types. Le standard et étendue entier signé types sont collectivement appelés entier signé types.
Plus tard, dans le même article, à l'alinéa 7 dit:
Types d' bool
, char
, char16_t
, char32_t
, wchar_t
, et les entiers signés et non signés types d'entiers sont collectivement appelés les types intégraux. Synonyme de type intégral est de type entier.
Par conséquent, char
est un type entier, mais char
n'est ni un entier signé de type ni d'un type entier non signé et de l'Article 18.4.1 (cité ci-dessus) dit qu' int8_t
, lorsqu'il est présent, est une typedef
pour un entier signé de type.
Ce qui pourrait être déroutant, c'est que, selon la mise en œuvre, char
peut prendre la même valeur, en signed char
. En particulier, char
pourrait avoir un signe mais c'est toujours pas un signed char
. C'est explicitement dit dans la Section 3.9.1/1:
[...] La plaine char
, signed char
, et unsigned char
sont de trois types distincts. [...] En particulier la mise en œuvre, un simple char
objet peut prendre la même valeur, en signed char
ou unsigned char
; celui qui est de la mise en œuvre définies.
Cela implique également que, char
est pas un nombre entier signé de type tel que défini par l'article 3.9.1/2.
3. J'avoue que mon interprétation et, plus précisément, la phrase "char
n'est ni un entier signé de type ni unsigned integer" est un peu controversé.
À force de mon cas, je voudrais ajouter que Stephan T. Lavavej dit la même chose ici et Johannes Schaub - litb également utilisé la même phrase dans un commentaire sur ce post.