文章目录
2. 数据类型
2.1 整型
整数就是没有小数部分的数字,如2、98、 -5286 和0。整数有很多,如果将无限大的整数看作很大,则不可能用有限的计算机内存来表示所有的整数。因此,语言只能表示所有整数的-一个子集。有些语言只提供一种整型(一种类型满足所有要求!),而C++则提供好几种,这样便能够根据程序的具体要求选择最合适的整型。
计算机内存由一些叫做位(bit) 的单元组成。C++的short、int、long和long long类型通过使用不同数目的位来存储值,最多能够表示4种不同的整数宽度。如果在所有的系统中,每种类型的宽度都相同,则使用起来将非常方便。例如,如果short 总是16位,int 总是32位,等等。不过生活并非那么简单,没有一种选择能够满足所有的计算机设计要求。C++提供了一种灵活的标准,它确保了最小长度(从C语言借鉴而来),如下所示:
● short至少16位;
● int 至少与short一样长;
● long至少32位,且至少与int一样长;
● long long至少64位,且至少与long一样长。
下面为64位操作系统中整型类型所占大小:
类型 | 所占字节数 | 表示范围 |
---|---|---|
short int | 2 | -32,768 ~ 32,767 |
unsigned short int | 2 | 0 ~ 65,535 |
int | 4 | -2,147,483,648 ~ 2,147,483,647 |
unsigned int | 4 | 0 ~ 4,294,967,295 |
long int | 4 | -2,147,483,648 ~ 2,147,483,647 |
unsigned long int | 4 | 0 ~ 4,294,967,295 |
long long in | 8 | -92233372036854775808 ~ 922333720368547758087 |
unsigned long long int | 8 | 0 to 18,446,744,073,709,551,615 |
// limits.cpp -- some integer limits
#include <iostream>
#include <climits> // use limits.h for older systems
int main()
{
using namespace std;
int n_int = INT_MAX; // initialize n_int to max int value
short n_short = SHRT_MAX; // symbols defined in climits file
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
// sizeof operator yields size of type or of variable
cout << "int is " << sizeof(int) << " bytes." << endl;
cout << "short is " << sizeof n_short << " bytes." << endl;
cout << "long is " << sizeof n_long << " bytes." << endl;
cout << "long long is " << sizeof n_llong << " bytes." << endl;
cout << endl;
cout << "Maximum values:" << endl;
cout << "int: " << n_int << endl;
cout << "short: " << n_short << endl;
cout << "long: " << n_long << endl;
cout << "long long: " << n_llong << endl;
cout << "Minimum int value = " << INT_MIN << endl;
cout << "Bits per byte = " << CHAR_BIT << endl;
cout << "char的位数[CHAR_BIT] : " << CHAR_BIT << endl;
cout << "char的最大值[CHAR_MAX] : " << CHAR_MAX << endl;
cout << "char的最小值[CHAR_MIN] : " << CHAR_MIN << endl;
cout << "signed char 最大值[SCHAR_MAX] : " << SCHAR_MAX << endl;
cout << "signed char 最小值[SCHAR_MIN] : " << SCHAR_MIN << endl;
cout << "unsigned char 最大值[UCHAR_MAX] : " << UCHAR_MAX << endl;
cout << "short 最大值[SHRT_MAX] : " << SHRT_MAX << endl;
cout << "short 最小值[SHRT_MIN] : " << SHRT_MIN << endl;
cout << "unsigned short 最大值[USHRT_MAX] : " << USHRT_MAX << endl;
cout << "int 最大值[INT_MAX] : " << INT_MAX << endl;
cout << "int 最小值[INT_MIN] : " << INT_MIN << endl;
cout << "unsigned int 最大值[UINT_MAX] : " << UINT_MAX << endl;
cout << "long 最大值[LONG_MAX] : " << LONG_MAX << endl;
cout << "long 最小值[LONG_MIN] : " << LONG_MIN << endl;
cout << "unsigned long 最大值[ULONG_MAX] : " << ULONG_MAX << endl;
cout << "long long 最大值[LLONG_MAX] : " << LLONG_MAX << endl;
cout << "long long 最小值[LLONG_MIN] : " << LLONG_MIN << endl;
cout << "unsigned long long 最大值[ULLONG_MAX] : " << ULLONG_MAX << endl;
return 0;
}
int is 4 bytes.
short is 2 bytes.
long is 4 bytes.
long long is 8 bytes.
Maximum values:
int: 2147483647
short: 32767
long: 2147483647
long long: 9223372036854775807
Minimum int value = -2147483648
Bits per byte = 8
char的位数[CHAR_BIT] : 8
char的最大值[CHAR_MAX] : 127
char的最小值[CHAR_MIN] : -128
signed char 最大值[SCHAR_MAX] : 127
signed char 最小值[SCHAR_MIN] : -128
unsigned char 最大值[UCHAR_MAX] : 255
short 最大值[SHRT_MAX] : 32767
short 最小值[SHRT_MIN] : -32768
unsigned short 最大值[USHRT_MAX] : 65535
int 最大值[INT_MAX] : 2147483647
int 最小值[INT_MIN] : -2147483648
unsigned int 最大值[UINT_MAX] : 4294967295
long 最大值[LONG_MAX] : 2147483647
long 最小值[LONG_MIN] : -2147483648
unsigned long 最大值[ULONG_MAX] : 4294967295
long long 最大值[LLONG_MAX] : 9223372036854775807
long long 最小值[LLONG_MIN] : -9223372036854775808
unsigned long long 最大值[ULLONG_MAX] : 18446744073709551615
2.2 sizeof关键字
作用:利用sizeof
关键字可以统计数据类型所占内存的大小。
语法:sizeof(数据类型/变量)
2.3 浮点型
了解各种C++整型后,来看看浮点类型,它们是C++的第二组基本类型。浮点数能够表示带小数部分的数字,如M1油箱的汽油里程数(0.56MPG),它们提供的值范围也更大。如果数字很大,无法表示为long类型,如人体的细菌数(估计超过100兆),则可以使用浮点类型来表示。
使用浮点类型可以表示诸如2.5、3.14159 和122442.32这样的数字,即带小数部分的数字。计算机将这样的值分成两部分存储。一部分表示值,另一部分用于对值进行放大或缩小。下面打个比方。对于数字34.1245和34124.5,它们除了小数点的位置不同外,其他都是相同的。可以把第一一个 数表示为0.341245 (基准值)和100 (缩放因子),而将第二个数表示为0.341245 (基准值相同)和10000 (缩放因子更大)。缩放因子的作用是移动小数点的位置,术语浮点因此而得名。C++内部表示浮点数的方法与此相同,只不过它基于的是二进制数,因此缩放因子是2的幂,不是10的幂。幸运的是,程序员不必详细了解内部表示。重要的是,浮点数能够表示小数值、非常大和非常小的值,它们的内部表示方法与整数有天壤之别。
2.3.1 浮点数表示——小数点表示法
C++有两种书写浮点数的方式。第一种是使用常用的标准小数点表示法:
12.34
939001.32
0.00023
8.0
2.3.2 浮点数表示——E表示法
第二种表示浮点值的方法叫做E表示法,其外观是像这样的: 3.45E6, 这指的是3.45与1000000相乘的结果; E6指的是10的6次方,即1后面6个0。因此,3.45E6 表示的是3450000,6被称为指数,3.45被称为尾数。下面是一些例子:
2.52e+8
8.33E-4
7E5
-18.32e13
1.69e12
5.98E24
9.11e-31
E表示法最适合于非常大和非常小的数。
E表示法确保数字以浮点格式存储,即使没有小数点。注意,既可以使用E也可以使用e,指数可以是正数也可以是负数。然而,数字中不能有空格,因此7.2 E6是非法的。
2.3.3 浮点数类型
和ANSIC-样,C++也有3种浮点类型: float、 double 和long double。这些类型是按它们可以表示的有效数位和允许的指数最小范围来描述的。有效位(significant figure)是数字中有意义的位。
事实上,C和C++对于有效位数的要求是, float至少32位, double至少48位,且不少于float, long double至少和double一样多。这三种类型的有效位数可以一样多。然而,通常,float 为32位,double 为64位,long double为80、96或128位。下面程序演示了float与double的精度差异。
#include<iostream>
int main()
{
using namespace std;
cout.setf(ios_base::fixed,ios_base::floatfield);
float tub = 10.0 / 3.0;
double mint = 10.0 / 3.0;
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;
return 0;
}
tub = 3.333333, a million tubs = 3333333.250000,
and ten million tubs = 33333332.000000
mint = 3.333333 and a million mints = 3333333.333333
说明
通常cout会删除结尾的零。例如,将333333.250000显示为333333.25。调用cout.setf()
将覆盖这种行为。tub 和mint都被初始化为10.0/3.0- 3.3333333333333…由于. cout打印6位小数,因此tub和mint都是精确的。但当程序将每个数乘以一百万后,tub 在7位有效位上还是精确的,但在第7个3之后就与正确的值有了误差。double 类型的变量显示了13个3,因此它至少有13位是精确的。
cout所属的ostream类有一个类成员函数,能够精确地控制输出的格式一字段宽度、 小数位数、采用小数格式还是E格式等。
2.4 字符型
作用:字符变量用于显示单个字符。
语法:char ch = 'a';
注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号。
注意2:单引号内只能有一个字符,不可以是字符串。
- C/C++中字符型变量只占1个字节。
- 字符型变量并不是把字符本身放到内存中存储,而是放入其对应的ASCII码。
程序示例:
// morechar.cpp -- the char type and int contrasted
#include <iostream>
int main()
{
using namespace std;
char ch = 'M';
int i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
cout << "Add one to the character code: " << endl;
ch = ch + 1;
i = ch;
cout << "The ASCII code for " << ch << " is " << i << endl;
// using the cout.put() member function to display a char
cout << "Displaying char ch using cout.put(): ";
cout.put(ch);
cout.put('!');
cout << endl << "Done" << endl;
return 0;
}
The ASCII code for M is 77
Add one to the character code:
The ASCII code for N is 78
Displaying char ch using cout.put(): N!
Done
说明
在程序中,‘M’ 表示字符M的数值编码,因此将char变量ch初始化为’M’, 将把c设置为77。然后,程序将同样的值赋给int变量i,这样ch和i的值都是77。接下来,cout把ch显示为M,而把i显示为77。如前所述,值的类型将引导cout选择如何显示值一这 是智能对象的另一个例子。
由于ch实际上是一一个整数,因此可以对它使用整数操作,如加1,这将把ch的值变为78。然后,程序将i重新设置为新的值(也可以将i加1)。cout再次将这个值的char版本显示为字符,将int版本显示为数字。
2.5 转义字符
作用:用于表示一些不能显示出来的ASCII字符
下表为C++转义序列的编码
2.6 字符串型
作用:用于表示一串字符。
两种风格:
- C风格:
char 变量名[] = “字符串值”
#include <iostream>
int main()
{
using namespace std;
char str[] = "hello";
cout<<str<<endl;
system("pause");
return 0;
}
- C++风格:
string 变量名 = “字符串值”
#include <iostream>
#include <string>
int main()
{
using namespace std;
string str = "hello";
cout<<str<<endl;
system("pause");
return 0;
}
2.7 布尔类型bool
作用:布尔数据类型代表真或假的值
bool类型只有两个值:
- true ——真(1)
- false——假(0)
bool类型只占用1个字节。