我会按相反的顺序回答你的问题。
标准是否指定此类型是否可以或将是字符类型?
简答:int8_t 在最流行的平台(Linux 上的 GCC/Intel/Clang 和 Windows 上的 Visual Studio)中是 signed char,但在其他平台上可能是别的东西。
下面是长答案。
C++11 标准的第 18.4.1 节提供了<cstdint> 的概要,其中包括以下内容
typedef 有符号整数类型 int8_t; //optional
稍后在同一部分的第 2 段中,它说
标头 [<cstdint>] 定义了与 C 标准中的 7.18 相同的所有函数、类型和宏。
根据 1.1/2,C 标准表示 C99:
C++ 是一种基于ISO/IEC 9899:1999 编程语言——C(以下简称C 标准)。
因此,int8_t 的定义可以在 C99 标准的第 7.18 节中找到。更准确地说,C99 的第 7.18.1.1 节说
typedef 名称 intN_t 指定一个有符号整数类型,宽度为 N ,没有填充位,使用二进制补码表示。因此,int8_t 表示宽度正好为 8 位的有符号整数类型。
此外,C99 的第 6.2.5/4 节说
标准有符号整数类型有五种,分别指定为signed char、short int、int、long int 和 long long int。 (如 6.7.2 中所述,这些和其他类型可以用几种其他方式指定。)也可能有实现定义的扩展有符号整数类型。 标准和扩展有符号整数类型统称为有符号整数类型。
最后,C99 的第 5.2.4.2.1 节规定了标准有符号整数类型的最小大小。除了signed char,其他所有的长度至少为 16 位。
因此,int8_t 是 signed char 或 8 位长扩展(非标准)有符号整数类型。
glibc(GNU C 库)和 Visual Studio C 库都将int8_t 定义为signed char。 Intel 和 Clang,至少在 Linux 上,也使用 libc,因此同样适用于它们。因此,在最流行的平台上int8_t 是signed char。
给定这个 C++11 程序,我应该期望看到一个数字还是一个字母?还是不抱期望?
简答:在最流行的平台(Linux 上的 GCC/Intel/Clang 和 Windows 上的 Visual Studio)中,您肯定会看到字母“A”。不过,在其他平台上,您可能会看到 65。 (感谢DyP 向我指出这一点。)
在续集中,所有引用均指向 C++11 标准(当前草案,N3485)。
第 27.4.1 节提供了<iostream> 的概要,特别是声明了cout:
extern ostream cout;
现在,ostream 是 typedef,根据第 27.7.1 节,basic_ostream 的模板特化:
template <class charT, class traits = char_traits<charT> >
class basic_ostream;
typedef basic_ostream<char> ostream;
第 27.7.3.6.4 节提供以下声明:
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, signed char c);
如果int8_t 是signed char,那么将调用这个重载。同一部分还指定此调用的效果是打印字符(而不是数字)。
现在,让我们考虑int8_t 是扩展有符号整数类型的情况。显然,该标准没有为非标准类型指定 operator<<() 的重载,但由于促销和转换,提供的重载之一可能会接受调用。实际上,int 至少有 16 位长,可以表示int8_t 的所有值。然后 4.5/1 给出了 int8_t 可以提升到 int。另一方面,4.7/1 和 4.7/2 表明 int8_t 可以转换 为 signed char。最后,13.3.3.1.1 产生了在重载解决期间提升比转换更受青睐。因此,以下重载(在 23.7.3.1 中声明)
basic_ostream& basic_ostream::operator
将被调用。这意味着,这段代码
int8_t i = 65;
std::cout << i;
将打印65。
更新:
1。更正了DyP的评论后的帖子。
2。添加了以下关于int8_t 成为typedef 的可能性char 的cmets。
如前所述,C99 标准(上面引用的第 6.2.5/4 节)定义了 5 种标准有符号整数类型(char 不是其中之一)并允许实现添加它们的 onw,它们被称为非标准有符号整数类型。 C++ 标准加强了第 3.9.1/2 节中的定义:
有五种标准有符号整数类型:“signed char”、“short int”、“int”、“long int”和“long long int” [...]整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。
稍后,在同一节中,第 7 段说:
类型bool、char、char16_t、char32_t、wchar_t、以及有符号和无符号整数类型统称为整数类型 .整数类型的同义词是整数类型。
因此,char 是整数类型,但 char 既不是有符号整数类型也不是无符号整数类型,第 18.4.1 节(上面引用)说int8_t,当present,是有符号整数类型的 typedef。
可能令人困惑的是,根据实现的不同,char 可以采用与 signed char 相同的值。特别是,char 可能有一个标志,但它仍然不是signed char。这在第 3.9.1/1 节中有明确说明:
[...] 普通 char、signed char 和 unsigned char 是三种不同的类型。 [...] 在任何特定的实现中,一个普通的char 对象可以采用与signed char 或unsigned char 相同的值;哪一个是实现定义的。
这也意味着char不是由 3.9.1/2 定义的有符号整数类型。
3。我承认我的解释,特别是“char既不是有符号整数类型也不是无符号整数类型”这句话有点争议。
为了证明我的观点,我想补充一点,Stephan T. Lavavej 说了同样的话here 和Johannes Schaub - litb 在this 帖子的评论中也使用了相同的句子。