引言:
类型确定了数据和操作在程序中的意义。比如普通的加号:
i = i + j;
有不同的含义,具体含义取决于 i 和 j 的类型。如果 i 和 j 都是整形,则这条语句表示一般的算数“+”运算;如果 i 和 j 都是类的对象,则这条语句是将这两个对象的组成成分分别加起来。
C++对类型的支持是非常广泛的:语言本身定义了一组基本类型和修改已有类型的方法,还提供了一组特征用于自定义类型。
基本内置类型包括:
算数类型(arithmetic type)和 void类型
(一)算数类型
包括:整数、浮点数、单个字符、布尔值。其中 整数、字符 和 布尔值 的算数类型合称为
整型。
所以:
算数类型包括整型和浮点型。
类型 | 含义 | 最小存储空间 |
bool | 布尔型 | —— |
char | 字符型 | 8位 |
wchar_t | 宽字符型 | 16位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
注:算数类型的存储空间依机器而定。这里的存储空间指用来表示该类型的二进制(bit)位数。C++标准规定了每个算数类型的最小存储空间,但它并不阻止编译器用更大的存储空间。事实上,对于int类型,几乎所有的编译器使用的存储空间都要比所要求的大。
要让某个地址中的自己具有意义,必须要知道存储在该地址的值的类型,否则我们无法判断存储在一段内存空间上的二进制代码如何翻译,例:假设内存空间736425 存储的二进制为:01110001 ,如果知道地址位736425的字节的类型是8位无符号整数,那么就可以知道该字节表示整数112,如果这个字节是ISO-Latin-1字符集中的一个字符,那它就表示小写字母q。虽然两种情况存储在内存空间的位一样,但是因为归属于不同的类型,解释也就不同。
参考书中 P31,<内置类型的机器级表示>很重要。
1.整型
一般情况下,short:半个机器字长(word),int:一个机器字长,long:一个或者两个机器字长,根据不同的机器不同。
(1)关于带符号类型和无符号类型。
除了bool类型外,整型可以是带符号的(signed),也可以是不带符号的(unsigned)。
int、short和long默认为带符号型,如要获得无符号型只能显示添加unsigned。
书上第32页指出:
和其他类型不同,char又三种不同的类型:普通char、unsigned char 和 signed char。虽然 char 有三种不同的类型,但是指具有两种表示方法。可以使用unsigned char或者signed char表示char类型,使用那种char表示方式由编译器决定,也就是说当我们在编译器上写明。
理解起来有些费解,经研究得知:程序里直接写一个int,默认是signed int,但是在程序中写char,就没有默认了,具体是signed char 还是 unsigned char取决于你的编译器,可以测试:
#include<iostream>
int main()
{
char c = 1;
printf("c = %d\n",c);
return 0;
}
如果测试结果是 1 ,则被编译位为 signed char,如果是255,则被编译位unsigned char,在我的电脑上,vc6.0 编译为signed char。
(2)整型值的表示。
unsigned类型中,所有的位都表示数值。
signed 类型,c++并未规定如何表示,具体决定于编译器。例如1 Byte = 8 bit,取值范围至少是 -127 到 127(例如反码表示),也有的实现 -128 到 127(补码表示)。
具体值的表示涉及到 原码、反码、补码等知识,可以查询相关知识补充理解。
(3)整型的赋值。
当我们将一个超出其取值范围的值给一个制定类型的对象时,会发生什么?答案取决于是 signed 还是 unsigned。
unsigned:
C++中,这种操作合法,其结果是该负数对该类型的取值个数求模后的值。
#include<iostream>
int main()
{
unsigned int ui = 1;
std::cout << ui << std::endl;
return 0;
}
2 的 32 次方 :4294967296
我的编译器输出:
signed:
超出范围的处理方式取决于编译器,有些编译器会做类似于上述unsigned的处理。
#include<iostream>
int main()
{
unsigned int ui = 4294967297;
std::cout << ui << std::endl;
return 0;
}
2. 浮点型
使用double类型基本上不会有错。
参考 《C++ primer 中文版》第四版 第32 页、33页,很重要。
(二)void类型
void类型其实是一种用于语法性的类型,而不是数据类型,主要用于作为函数的参数或返回值,或者定义void指针,表示一种未知类型。(书中未详细讲解,待以后详细分析)