0%

C++PrimerPlus_3.1数据类型

1. C++数据类型:整型,bool,char和浮点型

1.1. 整型

C++内置的整型 —— unsigned long, long, unsigned int, int, unsigned short, short, char, unsigned char, signed char, bool 和 unsigned long long, long long (C++ 11新增)

1.1.1. 整型short, int, long 和 long long

计算机内存由一些叫做位(bit)的单元组成,C++的short, int, long和long long分别用不同数目的位来储存值,最多能够表示4种不同的整数宽度。

如果在所有的系统中,每种类型的宽度都相同,则使用起来十分方便。例如,short总是16位,int总是32位,但生活并非那么简单,C++提供了另一种灵活的标准:

  • short 至少16位(2 bytes.)
  • int 至少与short一样长(4 bytes.)
  • long 至少32位,且至少与int一样长 (8 bytes.)
  • long long 至少64位,且至少与long一样长 (8 bytes.)

1.1.2. 无符号类型 unsigned

unsigned 是unsigned int的缩写

如果short表示的范围为-32768到+32767,则无符号版本的表示范围为0-65535,当然,仅当数值不会为负时才应使用无符号类型,如人口等。

1
2
3
4
5
unsigned short change;
unsigned int rovert;
unsigned rovertt; // also unsigned int
unsigned long gone;
unsigned long long lang_lang;

1.1.3. 整数字面型(进制问题)

C++ 使用前一(两)位来标识数字常量的基数。

  • 如果第一位为1 —— 9基数为10(十进制)
  • 如果第一位是0,第二位为1——7,则基数为8(八进制)
  • 如果前两位为0x或0X,则基数为16(十六进制)

pseudo code如下:

1
2
3
4
5
6
7
8
9
10
int chest = 42;     // decimal integer literal 十进制
int waist = 0x42; // hexadecimal integer literal 十六进制
int inseam = 042; // octal interger literal 八进制

// 在cout输出下:

chest = 42 (42 in decimal)
waist = 66 (0x42 in hex)
inseam = 34 (042 in octal)

1.1.4. char类型:字符和小整数

char类型是专门为储存字符(如字母和数字)而设计的。char类型也是一种整型,它足够长,能够表示目标计算机系统中的所有基本符号——字母,数字和标点符号等。char最常被用来处理字符,但也可以将它比作比short更小的整型。

最常用的符号集为ASCII字符集。
例如字符A的编码为65,字母M的编码为77等。

cin输入时,cin将键盘中输入的M转换为77;输出时,cout将77转换为所显示的字符M;cin和cout的行为都是由变量类型(ch)引导的。

C++对字符用单引号'M'对字符串用双引号。

cout.put()为成员函数,提供了一个显示字符的方法,可以代替cout <<

⚠️ 注意是字符而非字符串

亲测

1
2
3
cout.put('M'); // valid
cout.put('My'); // non valid
cout.put("My bag"); // non valid

1.1.5. C++转义序列的编码

字符名称 C++代码
换行符 \n
退格 \n
回车 \r
反斜杠 \\
问号 \?
单引号 \’
双引号 \”

1.1.6. bool 类型

bool布尔变量的值可以是true或false
例如:

1
bool is_ready = true;

1.2. const 限定符

如果程序在多个地方使用相同的一个常量时,可用const来修改变量声明和初始化。
例如,表示一年中月份的符号常量:

1
const int Months = 12;

常量Months被初始化后,其值就被固定了,编译器将不允许再修改该常量的值。

一种常见的做法是常量的首字母大写Months,有助于区分常量变量。另外一种做法是以字母k打头kmonths

1.3. 浮点数

C++有3种浮点类型:float,double和long double。

浮点数能够表示带小数部分的数字,诸如2.5,3.14159,122442.32这样的数字。

计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。

打个比方,对于数字34.1245和34124.5,他们除了小数点位置不同,其他事相同的。

可以把第一个数表示为0.341245(基准值)和100(缩放因子);第二个数0.341245(基准值)和10000(缩放因子)。

缩放因子的作用是移动小数点的位置,术语浮点也因此得名。

C++内部表示浮点数的方法与此相同,只不过它基于的是二进制数,因此缩放因子是2的幂,不是10的幂。

1.3.1. 浮点数的表示法

  • 第一种 是使用常用的标准小数点表示法:
1
2
3
12.34
0.00023
8.0 // 保证了是float而非int
  • 第二种 是使用E表示法
    其外观类似3.45E6,意思是3.45与1000000相乘的结果;E6指的是10的6次方。
    E表示法确定数字以浮点格式存储,即使没有小数点。
1
2
3
2.52e+8 // valid
8.33E5 // valid
8.33E-4 // valid, exponent can be negative

1.3.2. 浮点的类型float,double和long double

浮点数的三种类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。

有效位(significant figure)是指数字中有意义的位,

🍑 例如:

某山脉额高度位14179英尺,该数字使用了5个有效位。

然而,将其高度写成约14000英尺时,其有效数位为2。因为结果进行了四舍五入精确到了千位。这种情况下,其余的3位仅仅为占位符。

有效数位不依赖于小数点的位置。

例如,可以将山脉高度写为14.162千英尺,这样仍然是5个有效位。


C++对于有效位数的要求是:

  • float 至少32位
  • double至少48位,且不少月float
  • long double至少和double一样多

但通常:

  • float为32位
  • double为64位
  • long double为80,96或128位

书本p48页提供了一个例子说明了double比float提供的精度更高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield); // fixed-point
float tub = 10.0 / 3.0; // good to about 6 places
double mint = 10.0 / 3.0; // good to about 15 places
const float million = 1.0e6;

cout << "tub = " << tub;
cout << ", a million tubs = " << million * tub;
cout << ",\nand ten million tubs = ";
cout << 10 * million * tub << endl;

cout << "mint = " << mint << " and a million mints = ";
cout << million * mint << endl;
// cin.get();
return 0;
}

1.3.2.1. 浮点常量

在程序中书写副电厂粮食,像8.24或2.4E8这样的浮点都属于double类型。

如果你希望常量为float类型,请使用f或F后缀。

如果你希望常量为long double类型,可使用l或L后缀(由于l看起来很像数字1,因此L位更好的选择)

1
2
3
1.234f // a float constsant
2.3423 // a double constant
2.2L // a long double constant

1.3.2.2. 浮点和整数的对比

  • 浮点优点:浮点可以表示整数
  • 浮点优点:由于有缩放因子,他们可以表示的范围大的多
  • 浮点缺点:浮点运算速度比整数运算速度慢,其精度降低
-------------本文结束感谢您的阅读-------------