目录
隐式类型转换
转型方向
整型提升和截断
显示转换的种类
C风格的强制类型转换
C++风格的函数样式转换
隐式类型转换
转型方向
隐式类型转换,又称自动转换、算数转换,是由编译器自动完成的类型转换称为隐式类型转换。自动转换的原则为:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。转换方向如下:
整型提升和截断
整型提升
当值域小的数向值域大的数转换时,会发生整型提升,整型提升的规则如下:
有符号类型,高位补符号位;无符号类型,高位补0。
相关解释如下:
在进行整型提升,即小的整型向大的整型转换时遵循这样的规则:有符号数,高位补符号位;无符号数,高位补零。至于为什么有符号数为什么要补符号位,是一个很容易让人疑惑的点。但是最终通过数学证明得出:“当有符号数从一个较小的数据类型转换成较大类型时,进行符号位扩展(高位补符号位),可以保持数值不变”。(证明过程太过复杂,详见《深入理解计算机系统》P55)
截断
当高字节向低字节转换时,多余的字节被删除,这个过程称之为截断。截断一个数字,可能会改变它原来的数值。例如:将long类型的数据赋值给char类型的数据时,这时候long类型的变量只将最低的一位赋给了char类型的变量,而高位数据全部被“截断”了。
显示转换的种类
手动地将数据从一种类型更改为另一种类型的操作被称为显式转换,也叫强制类型转换。C++中的显示转换有3种:
C型风格的强制类型转换
函数表示法,也称为C++旧式风格的类型转换
类型转换运算符:static_cast、dynamic_cast、const_cast、reinterpret_cast。这4个是C++11新增的相对比较安全的类型转换运算符。
C风格的强制类型转换
语法格式:
(data_type)expression;
用法示例:
int num_int = 26;
double num_double;// 从int转换为double
num_double = (double)num_int;
C++风格的函数样式转换
语法格式:
data_type(expression);
用法示例:
int num_int = 26;
double num_double;// 从int转换为double
num_double = double(num_int);
C++11新增的四个类型转换
未完待续……