数据类型
c++程序员已经知道c语言有五种数据类型:void,int,float,double和char:
类型 描述
void 无数据类型
int 整数类型
float 浮点数
double 双精度浮点数
char 字符型
c++有额外定义了两种类型:bool和wchar_t:
类型 描述
bool 布尔变量,true或者false
wchar_t 宽字符
类型修饰符
这几个类型中的部分可以使用以下几个关键字来修饰:signed,unsigned,short和long. 如果只有类型修饰符自己被使用,则数据类型会被缺省地认为int.下面是一个完整的列表列出了可能的数据类型(等效的会被显示在同一行,并且用,隔开)
整数类型
bool
char, signed char
unsigned char
short, short int, signed short int
unsigned short, unsigned short int
int, signed int
unsigned, unsigned int
long, long int, signed long, signed long int
unsigned long, unsigned long int
浮点类型
float
double
long double
可选支持的整数类型
long long, signed long long, long long int, signed long long int
unsigned long long, unsigned long long int
wchar_t
类型的大小和范围
任何一种数据类型的大小和范围都是编译器相关的. 头文件"cfloat"(或者"float.h")经常定义了各种数据类型的最大最小值.你可以使用操作符sizeof来测试任何一种数据类型的大小(这里的大小是指该类型的变量说占用的空间大小,即占用的字节数).然而,很多的系统会依据某一标准来实现数据类型.整型和浮点型通常是32位,字符8位,双精度64位.布尔变量则常会是8位.long long类型是64位.
数字值的限制是定义在头文件<limits>里. 模板化的类numeric_limits提供了系统相关的c++数据类型的表现。 使用适当的函数并且以数据类型作为模板参数可以返回一些需要的信息。需要注意的是mumeric_limits是可以被用户定义的类型重载。
下面是一些相关的函数(译者:其实有些是静态成员变量,至少在dev-c++里如此):
方法 返回类型 描述
is_specialized bool
radix int 指数的底
digits int 尾数中的基数位数
digits10 int 尾数中的10进制数位数
is_signed bool
is_integer bool
is_exact bool
min <type> 可以表示的最小数(不是负的最小数)
max <type> 最大数
epsilon <type> 固有误差
round_error <type> 最大取正误差(即四舍五入就是0.5)
infinity <type>
quiet_NaN <type> 不能标示浮点错误的无效数字
signaling_NaN <type> 标示浮点错误的无效数字
denorm_min <type>
min_exponent int
min_exponent10 int
max_exponent int
max_exponent10 int
has_infinity bool
has_quiet_NaN bool
has_signaling_NaN bool
has_denorm <type>_denorm_style
has_denorm_loss bool
is_iec559 bool 遵照IEC-559规范
is_bounded bool
is_modulo bool
traps bool
tinyness_before bool
round_style float_round_style { round_to_nearest, … } //float_round_style是一个枚举类型,具体可以参考<limits>
最通常的用法就是边界检查来确认某一数据类型可以表示的最大最小值。接下来的代码打印出了该系统平台上short类型的最值:
#include <limits>
std::cout << "Maximum short value: " << std::numeric_limits<short>::max() << std::endl;
std::cout << "Minimum short value: " << std::numeric_limits<short>::min() << std::endl;
理解类型声明
简单的类型声明很容易理解:
int i
然而,有时也会有十分复杂的类型声明:
double **d[8] //hmm...
char *(*(**foo [][8])())[] //augh! foo到底是什么?
为了理解上面的声明,可以遵循下面的三个规则:
1.从变量名开始(在上例中就是d或者foo)
2.以数据类型结尾(double或者char)
3.如果可以的话向右,必须的话则向左(括号可能会让你改变方向)
例如:
表达式 意义
double **d[8];
double **d[8]; d 是 … double
double **d[8]; d 是 8维数组 … double
double **d[8]; d 是 8维数组且成员为 指针且指向 … double
double **d[8]; d 是 8维数组且成员为 指针且指向 指针且指向 double