隐式转换
基本类型转换
整形提高
表达式计算时,整型会首先提高到int类型,当int类型表示的范围不够时,会提高为unsigned int类型。c语言中能够进行整型提高的包括bool,char,short及其对应的无符号类型。下面例子中,无论是bool,char仍是short类型,在进行算术运算时,运算结果大小都是4个字节,这是由于编译器会默认对这些整型进行提高,转为4个字节再进行运算。安全
int main() { bool b1 = true; bool b2 = true; // output: 4 2 cout << sizeof(b1 + b2) << " " << b1 + b2 << endl; char c1 = 'a'; char c2 = 'b'; // output 4 195 cout << sizeof(c1 + c2) << " " << c1 + c2 << endl; short s1 = INT16_MAX; short s2 = 1; // output 4 32768 cout << sizeof(s1 + s2) << " " << s1 + s2 << endl; return 0; }
算术转换
- 整型和浮点数相加获得浮点型;
- 有符号整型和有符号整型相加获得其中较大的有符号整型;
- 无符号整型和无符号整型相加获得其中较大的无符号整型;
- 有符号整型和无符号整型相加获得较大空间的类型,若是有符号整型空间大,则结果为有符号整型,若是无符号整型空间大,则结果为无符号整型,若是有符号整型和无符号整型空间相等,则结果为无符号整型。
总结来讲,算术转换会往较大空间类型的方向转换;若是空间同样,则会往浮点型或者无符号方向转换。ui
int i1 = INT32_MAX; long long ll1 = 1; // output 8 2147483648 cout << sizeof(i1 + ll1) << " " << i1 + ll1 << endl; unsigned int ui1 = 1; // output 4 2147483648 cout << sizeof(i1 + ui1) << " " << i1 + ui1 << endl; int i2 = 1; // output 4 -2147483648 整数溢出 cout << sizeof(i1 + i2) << " " << i1 + i2 << endl;
指针转换
任何指针类型均可以隐式转换成void*类型,反之不成立。spa
int a = 0; int* pa = &a; void* pb = pa; // 正确 pa = pb; // 编译错误
显示转换
第一部分中提到了C语言中基本类型之间的转换以及任意指针转换为void指针,这些转换均可以隐式地进行,编译器默认帮助开发者操做,不会报错。然而,对于void指针转换为某个具体类型的指针或者任意两种不是void类型指针之间的转换来讲,编译器都会抛出错误。须要明确的一点是,C语言中任意类型指针之间都是能够完成转换的,只不过编译器以为这个转换很不安全,不会帮咱们暗地里操做,须要程序开发者我的断定安全性,使用显示转换。有人可能会以为第一部分中的转换也很不安全,好比double转为int,会使得数值损失精度,事实确实如此,但相比任意指针间的转换来讲,这种转换的风险小得多,所以对于第一部分的状况,编译器支持默认转换。指针
int a = 0; void* pa = &a; int* pb = (int*)pa; // 正确,输出0 cout << *pb << endl; // 正确,输出空,由于a为0,其第一个字节为0,在char型变量中,表示空 char* pc = (char*)pb; cout << *pc << endl;