基本内置类型
C++ 定义了一组表示整数、浮点数、单个字符和布尔值的算术类型,另外还定义了一种称为 void 的特殊类型。
算术类型的存储空间依机器而定。这里的存储空间是指用来表示该类型的位(bit)数。C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。
C++ 算术类型 :
类型 |
含义 |
最小存储空间 |
bool |
布尔类型 |
未定义 |
char |
字符 |
8 bits |
wchar_t |
宽字符 |
16 bits |
char16_t |
Unicode字符 |
16 bits |
char32_t |
Unicode字符 |
32 bits |
short |
短整型 |
16 bits |
int |
整型 |
16 bits |
long |
长整型 |
32 bits |
long long |
长整型 |
64 bits |
float |
单精度浮点数 |
6 位有效数字 |
double |
双精度浮点数 |
10 位有效数字 |
long double |
扩展双精度浮点数 |
10 位有效数字 |
因为位数的不同,这些类型所能表示的最大(最小)值也因机器的不同而有所不同。
整型
表示整数、字符和布尔值的算术类型合称为整型 。
字符类型有两种:char 和 wchar_t。char 类型保证了有足够的空间,能够存储机器基本字符集中任何字符相应的数值,因此,char 类型通常是单个机器字节(byte)。wchar_t 类型用于扩展字符集,比如汉字和日语,这些字符集中的一些字符不能用单个 char 表示。
short、 int 和 long 类型都表示整型值, 存储空间的大小不同。一般, short类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机器字长(在 32 位机器中 int 类型和 long 类型通常字长是相同的)。
整型赋值
把一个非bool类型的算术值赋给布尔类型时,初始值为0则结果为false,否则结果为true。
把一个bool类型的值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。
把一个浮点数赋给整数时,进行了近似处理。结果值将仅保留浮点数中小数之前的部分。
把一个整数赋值给浮点类型时,小数部分记作0。
给无符号类型赋一个超过其表示范围的值时,结果是初始值对无符号类型标识数值总数取模后的余数。例如,如果试图将 336 存储到 8 位的 unsigned char 中,则实际赋值为 80,因为 80 是 336 对 256 求模后的值。
对于无符号类型来说,负数总是超出其取值范围。无符号类型的对象可能永远不会保存负数。有些语言中将负数赋给无符号类型是非法的。C++ 中,把负值赋给无符号类型是完全合法的,其结果是该负数对该类型的取值个数求模后的值。所以,如果把 -1 赋给 8 位的 unsigned char,那么结果是 255,因为 255 是 -1 对256 求模后的值。
给带符号类型赋一个超出它表示范围的值时,结果是未定义的,此时程序可能继续工作、可能崩溃,也可能生成垃圾数据。
含有无符号类型的表达式
当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数,把int转换成无符号数的过程和把int直接赋给无符号变量是一样的:
unsigned u=10;
int i=-42;
cout<<i+i<<endl; //输出-84
cout<<u+i<<endl; //若int占32位,输出4294967264
第一个输出表达式中两个负数相加得到了期望的结果;第二个输出表达式中,先把-42转换成无符号数再进行计算。
当从无符号数中减去一个值时,必须保证结果不能是负值:
unsigned u1 = 42, u2 = 10;
cout << u1 - u2 << endl; //输出32
cout << u2 - u1 << endl; //结果是取模后的值
在for循环中使用无符号数,要特别注意:
for (unsigned i = 10; i >= 0; i--)
cout << i << endl;
这个循环将永远进行下去。
浮点型
类型 float、 double 和 long double 分别表示单精度浮点数、双精度浮点数和扩展精度浮点数。一般 float 类型用一个字(32 位)来表示,double 类型用两个字(64 位) 来表示, long double 类型用三个或四个字(96 或 128 位)来表示。类型的取值范围决定了浮点数所含的有效数字位数。
对于实际的程序来说,float 类型精度通常是不够的——float 型只能保证 6 位有效数字,而 double 型至少可以保证 10 位有效数字,能满足大多数计算的需要。