C++ 整数类型的大小

示例

以下类型定义为整数类型

  • char

  • 有符号整数类型

  • 无符号整数类型

  • char16_t 和 char32_t

  • bool

  • wchar_t

除了sizeof(char)/ sizeof(signed char)/ sizeof(unsigned char),它在§3.9.1.1 [basic.fundamental / 1]和§5.3.3.1 [expr.sizeof]之间分割,并且sizeof(bool)完全由实现定义,没有最小大小,最小大小这些类型的要求在标准的第3.9.1节[基本]中给出,并在下面进行详细说明。

尺寸 char

C ++标准的所有版本指定,在§5.3.3.1,即sizeof产率1为unsigned char,signed char,和char(它被实现中定义的是否char类型是signed或unsigned)。

C ++ 14

char 足够大,可以表示256个不同的值,适合存储UTF-8代码单元。

有符号和无符号整数类型的大小

该标准规定,在§3.9.1.2,在列表中的整数类型签名标准,包括signed char,short int,int,long int,和long long int,每种类型将提供至少相同的存储那些在列表中它前面。此外,在§3.9.1.3作为指明,每个这些类型的具有对应的标准的无符号整数类型,unsigned char,unsigned short int,unsigned int,unsigned long int,和unsigned long long int,其具有相同的尺寸和取向作为其对应的符号的类型。另外,如在§3.9.1.1指定,char具有的尺寸和对准要求二者相同signed char和unsigned char。

C ++ 11

在C ++ 11之前,long long并且unsigned long long尚未正式成为C ++标准的一部分。然而,他们的介绍C后,在C99,许多编译器的支持long long作为一个扩展的有符号整数类型,并unsigned long long为扩展无符号整数类型,具有相同的规则的C类型。

因此,该标准保证:

1 == sizeof(char)  == sizeof(signed char) == sizeof(unsigned char)
  <= sizeof(short) == sizeof(unsigned short)
  <= sizeof(int)   == sizeof(unsigned int)
  <= sizeof(long)  == sizeof(unsigned long)

C ++ 11
 <= sizeof(long long) == sizeof(unsigned long long)

标准没有给出每种类型的特定最小尺寸。相反,每种类型都有其可以支持的最小值范围,如3.9.1.3节中所指定,它是从5.2.4.2.1节中的C标准继承而来的。通过确定所需的最小位数,可以从该范围大致推断出每种类型的最小大小。请注意,对于任何给定的平台,任何类型的实际支持范围都可能大于最小值。请注意,对于有符号类型,范围对应于一个补码,而不是更常用的二进制补码;这是为了允许更广泛的平台符合该标准。

类型最小范围所需的最低位
signed char-127〜127( - (2 7 - 1)至(2 7 - 1))8
unsigned char0至255(0至2 8-18
signed short-32,767至32,767( - (2 15 - 1)至(2 15 - 1))16
unsigned short0至65535(0至2 16 - 1)16
signed int-32,767至32,767( - (2 15 - 1)至(2 15 - 1))16
unsigned int0至65535(0至2 16 - 1)16
signed long-2,147,483,647到2,147,483,647( - (2 31 - 1)至(2 31 - 1))32
unsigned long0至4294967295(0到2 32 - 1)32
C ++ 11
类型最小范围所需的最低位
signed long long-9,223,372,036,854,775,807 9,223,372,036,854,775,807( - (2 63 - 1)到(2 63 - 1))64
unsigned long long0至18,446,744,073,709,551,615(0到2 64 - 1)64

由于每种类型都可以大于其最小大小要求,因此不同实现之间的类型可能有所不同。最明显的例子是64位数据模型LP64和LLP64,其中LLP64系统(例如64位Windows)具有32位ints和longs,而LP64系统(例如64位Linux)具有32位和s。位int和64位long。因此,不能假定整数类型在所有平台上都具有固定的宽度。

C ++ 11

如果整数类型具有固定宽度需要从,利用类型<cstdint>报头,但请注意,它可选的实施方式中的标准品牌支持精确宽类型int8_t,int16_t,int32_t,int64_t,intptr_t,uint8_t,uint16_t,uint32_t,uint64_t和uintptr_t。

C ++ 11

char16_t和的大小char32_t

的大小char16_t和char32_t由实现定义,如在§5.3.3.1指定,在§3.9.1.5给出的规定:

  • char16_t足够大,可以表示任何UTF-16代码单元,并且具有与;相同的大小,符号和对齐方式uint_least16_t。因此,要求大小至少为16位。

  • char32_t足够大,可以表示任何UTF-32代码单元,并且具有与;相同的大小,符号和对齐方式uint_least32_t。因此,要求其大小至少为32位。

尺寸 bool

的大小由bool实现定义,可以为,也可以不为1。

wchar_t的大小

wchar_t如第3.9.1.5节中所述,是一种独特的类型,其值的范围可以代表受支持的语言环境中最大扩展字符集的每个独特的代码单元。它具有与其他整数类型之一相同的大小,正负号和对齐方式,这被称为其基础类型。如5.3.3.1节所述,此类型的大小由实现定义,并且可以为至少8位,16位或32位。例如,如果系统支持Unicode,wchar_t则必须至少为32位(此规则的例外是Windows,wchar_t出于兼容性目的,此处为16位)。它是从C90标准ISO 9899:1990§4.1.5继承而来的,仅作了少量修改。

取决于实现方式,的大小wchar_t通常(但不总是)为8、16或32位。其中最常见的示例是:

  • 在Unix和类似Unix的系统中,它wchar_t是32位的,通常用于UTF-32。

  • 在Windows中wchar_t是16位,用于UTF-16。

  • 在仅支持wchar_t8位的系统上为8位。

C ++ 11

如果需要Unicode支持,建议使用charUTF-8,char16_tUTF-16或char32_tUTF-32,而不要使用wchar_t。


资料模型

如上所述,整数类型的宽度在平台之间可以不同。最常见的模型如下,其大小以位为单位:

模型intlong指针
LP32(2/4/4)163232
ILP32(4/4/4)323232
LLP64(4/4/8)323264
LP64(4/8/8)326464

这些型号中:

  • 16位Windows使用LP32。

  • 32位* nix系统(Unix,Linux,Mac OSX和其他类似Unix的操作系统)和Windows使用ILP32。

  • 64位Windows使用LLP64。

  • 64位* nix系统使用LP64。

但是请注意,这些模型并未在标准本身中特别提及。