简单总结一些经常用到又不注意的数据类型转换,简单的精度提升就不介绍了。
包括常量转换,指针类型转换等
1.在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,
例如 int ival;
double dval;
ival=dval; //dval转换为int,切除小数部分
2.两种类型的字节数相同,一种有符号,一种无符号,则转换成无符号类型
例如 int ival;
unsigned long ulval;
ival+ulval; //ival转换为unsigned long
3,转换成常量int ival;
const int &j=ival;//非常量转换成常量引用
const int *p=&ival;//非常量地址转换成常量地址
相反的转换时不允许的。
4.static_cast<>
较大数据类型转为较小数据类型
例如:double dval;
int ival;
ival *= dval; //ival转化为double 型,然后将乘法操作的double 型结果截尾为int型,再赋给ival。
为了去掉ival转换为double 型这个不必要的转换,可以通过如下强制将dval转化为int型:
ival *= static_cast<int>(dval);
4.指针类型的转换
指针变量,本质上是一个变量,只是它是存放地址的变量,指针的类型代表的是它所指向的变量的类型。因此就有了指向整型、字符型、浮点型等其它类型的指针,但实际上所有类型的指针变量存放的都是int型(对于16位编译系统,比如TC,int是2字节,对于32位编译系统,比如VC,GCC,int是4字节)的地址。因此从本质上不同类型的指针变量并没有区别(因为指针变量的类型为int型,因此指针变量只能存放地址。注意和指针指向对象的类型区分开),指针变量所存储的地址为指针所指向的对象的首地址。
我们都知道不同类型的指针变量指向不同类型的对象,这些指针变量结合指针运算符(*)就等价于指向的对象的值,但我们又知道所有的指针变量的类型都是一样的(都是int型)。到底声明不同类型的指针变量的背后是什么?其实声明不同类型的指针变量既是规定了该变量结合指针运算符时读取内存中的字节数,同样在指针移动和指针的运算时(加、减)在内存中移动的最小字节数。