2.1.1 算术类型(1)
算术类型分为两类:整型(integral type,包括字符和布尔类型在内)和浮点型。
算术类型的尺寸(也就是该类型数据所占的比特数)在不同机器上有所差别。表2.1列出了C++(www.cppentry.com)标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,它所能表示的数据范围也不一样。
表2.1:C++(www.cppentry.com):算术类型
|
表2.1:C++(www.cppentry.com):算术类型
|
|
类型
|
含义
|
最小尺寸
|
|
bool
|
布尔类型
|
未定义
|
|
char
|
字符
|
8位
|
|
wchar_t
|
宽字符
|
16位
|
|
char16_t
|
Unicode字符
|
16位
|
|
char32_t
|
Unicode字符
|
32位
|
|
short
|
短整型
|
16位
|
|
int
|
整型
|
16位
|
|
long
|
长整型
|
32位
|
|
long long
|
长整型
|
64位
|
|
float
|
单精度浮点数
|
6位有效数字
|
|
double
|
双精度浮点数
|
10位有效数字
|
|
long double
|
扩展精度浮点数
|
10位有效数字
|
布尔类型(bool)的取值是真(true)或者假(false)。
C++(www.cppentry.com)提供了几种字符类型,其中多数支持国际化。基本的字符类型是char,一个char的空间应确保可以存放机器基本字符集中任意字符对应的数字值。也就是说,一个char的大小和一个机器字节一样。
其他字符类型用于扩展字符集,如wchar_t、char16_t、char32_t。wchar_t类型用于确保可以存放机器最大扩展字符集中的任意一个字符,类型char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中字符的标准)。
除字符和布尔类型之外,其他整型用于表示(可能)不同尺寸的整数。C++(www.cppentry.com)语言规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。其中,数据类型long long是在C++(www.cppentry.com)11中新定义的。
内置类型的机器实现
计算机以比特序列存储数据,每个比特非0即1,例如:
- 00011011011100010110010000111011 ...
大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为"字节(byte)",存储的基本单元称为"字(word)",它通常由几个字节组成。在C++(www.cppentry.com)语言中,一个字节要至少能容纳机器基本字符集中的字符。大多数机器的字节由8比特构成,字则由32或64比特构成,也就是4或8字节。
大多数计算机将内存中的每个字节与一个数字(被称为"地址(address)")关联起来,在一个字节为8比特、字为32比特的机器上,我们可能看到一个字的内存区域如下所示:
其中,左侧是字节的地址,右侧是字节中8比特的具体内容。
我们能够使用某个地址来表示从这个地址开始的大小不同的比特串,例如,我们可能会说地址736424的那个字或者地址736427的那个字节。为了赋予内存中某个地址明确的含义,必须首先知道存储在该地址的数据的类型。类型决定了数据所占的比特数以及该如何解释这些比特的内容。
如果位置736424处的对象类型是float,并且该机器中float以32比特存储,那么我们就能知道这个对象的内容占满了整个字。这个float数的实际值依赖于该机器是如何存储浮点数的。或者如果位置736424处的对象类型是unsigned char,并且该机器使用ISO-Latin-1字符集,则该位置处的字节表示一个分号。
浮点型可表示单精度、双精度和扩展精度值。C++(www.cppentry.com)标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。通常,float以1个字(32比特)来表示,double以2个字(64比特)来表示,long double以3或4个字(96或128比特)来表示。一般来说,类型float和double分别有7和16个有效位;类型long double则常常被用于有特殊浮点需求的硬件,它的具体实现不同,精度也各不相同。