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++代码
1.1.6. bool 类型
bool布尔变量的值可以是true或false
例如:
1.2. const 限定符
如果程序在多个地方使用相同的一个
常量
时,可用
const
来修改变量声明和初始化。
例如,表示一年中月份的符号常量:
常量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. 浮点和整数的对比
浮点优点:浮点可以表示整数
浮点优点:由于有缩放因子,他们可以表示的范围大的多
浮点缺点:浮点运算速度比整数运算速度慢,其精度降低