类型转换
- 1.类型转换
- 1.1隐式转换
- 1.2常用算术转换
- 1.2强制类型转换
1.类型转换
在执行算数运算时,计算机比C语言的限制更多。为了让计算机执行算术运算,通常要求操作数用相同的大小(即为的数量相同),但是C语言却允许混合使用基本类型。在这过程是由于编译器会自动进行隐形转换,当然C语言也允许程序员使用强制运算符执行显示转换。
首先讨论隐式转换
1.1隐式转换
解释最常用的算术转换
1.2常用算术转换
算数转换多用于二元运算符的操作数上,算数转换是为了能安全地使用两个操作数我们需要相应的数据类型。也就是往往我们进行提升,通俗来说就是一个存储字节大的类型和一个存储字节小的类型,我们倾向与使用都使用存储字节大的类型
最常用的就是整形提升
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀
般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。
执行常用算术转换的规则可以划分成两种情况
- 任意操作数的类型是浮点型的情况。
按照float->double->long double,倘若涵盖了混合整数和浮点数类型的情况,那便将整形转换成浮点型
这就是为什么double sun=1.0/2等于0.000000
因为默认所给数为整形,1和2都是整形执行除法得到整形0隐性转换成double类型(默认保留六位小数)为0.000000
而double sum=1.0/2,1.0默认为double类型而2默认为整形,提升整形2被隐性转化为double类型,此时执行的就是为什么除法仅仅要求一个数为浮点数因为另一个操作数会提升 - 两个操作数的类型都不是浮点型的情况
int->unsigned int->long int->unsigned long int
尽管提升方便了我们的计算,但也会导致某些隐蔽的编程错误
假设 int a=-10 unsigned int b=10
if(b>a),我们期望该条件为真。但由于提升我们会将有符号数int转换为无符号数unsigned int也就是说我们会把符号位1当成数来表示,因此a会变成一个极大数此时条件为假
1.2强制类型转换
(类型名)表达式