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比特的机器上,我们可能看到一个字的内存区域如下所示:
|
736424 |
0 0 1 1 1 0 1 1 |
|
736425 |
0 0 0 1 1 0 1 1 |
|
736426 |
0 1 1 1 0 0 0 1 |
|
736427 |
0 1 1 0 0 1 0 0 |
其中,左侧是字节的地址,右侧是字节中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则常常被用于有特殊浮点需求的硬件,它的具体实现不同,精度也各不相同。