2.1 基本内置类型
2.1.1 算术类型
内存计量单位说明:
- 位:bit(binary digit,简写b),是计算机数据存储的嘴角单位,二进制中,0或1就是一个位。系统的32位和64位指的就是bit。
- 字节:Byte(简写B),是计算机信息技术用于计量存储容量的一种计量单位,是可寻址的最小内存块。一个字节要至少能容纳及其基本字符集中的字符。通常情况下:1Byte = 8bit->1B = 8b。
- 字:word,是存储的基本单元。通常由32比特或64比特构成,也就是4或8字节
算术类型的尺寸,既该类型数据所占的比特数,在不同的机器上大小不同。下表2.1列出了C++标准规定的尺寸最小值,同时允许编译器赋予更大的尺寸。类型所占的比特数不同,表示的数据范围也不一样。
表2.1 C++算术类型尺寸
类型 | 含义 | 最小尺寸 |
---|---|---|
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位有效数字 |
一个char的大小和一个机器字节一样。C++语言规定,一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。在编译器中,通常,float以1个字(32比特)来表示,double以2个字(64比特)来表示,long double以3或4个字(96或128比特)来表示。一般来说float和double分别由7和16个有效位。
带符号类型和无符号类型
带符号:int,short,long,long long
无符号:在上述类型前加unsigned关键字
char类型被分为了char、signed char、unsigned char三种。字符的表现形式有两种:带符号的和无符号的,char类型由编译器决定表现为上述两种形式的其中一种。
2.1.1 习题
- 练习2.1
答(1):int、long、long long、short之间的区别是数据类型所占的比特数不同,表达的取值范围不同。
答(2):无符号类型和有符号类型之间的数据取值范围不同,有符号类型会将其中一个比特作为符号位。
答(3):float为单精度浮点数,double为双精度浮点数,两者在计算代价方面相差无几,对于某些机器来说,双精度运算要比单精度运算要快。
- 练习2.2
答:用double类型。
2.1.2 类型转换
对象类型定义了对象能包含的数据和能参与的计算。
类型所能表示的值的范围决定了转换的过程:
- 初始值为0布尔值为false,否则为true
- 初始值为false结果为0,初始值为true结果为1
- 浮点数赋值给整数时,仅保留浮点数的整数部分
- 整数赋值给浮点数时,小数部分记为0,若整数所占空间超过浮点类型的容量,精度可能损失
- 当给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
- 当给有符号类型一个超出它表示的范围的值时,结果是未定义的。
注:一段程序在不同的编译器下编译的结果可能不同,这种结果会导致程序不可移植,在开发过程中要避免程序依赖实现环境。例如,不同类型在不同机器或编译器上的尺寸不同,此时,在程序中就不可以假定该类型的定长。