c语言小白基础学习--数据类型转换!在给大家分享这个文章之前,小编推荐大家加一下这个裙:六六六二九五四九八 邀请编码【凌云】大家遇到啥问题都会在里面交流!而且文件里有各种资源,是个非常好的学习交流地方!也有程序员大神给大家热心解答各种问题!很快满员了。欲进从速哦!等大家加入C/C++学习基地哦
在执行算术运算时,计算机比C语言的限制更多。为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数
量相同),并且要求存储的方式也相同。计算机可能可以直接将两个16位整数相加,但是不能直接将16位整数和32位整数相
加,也不能直接将32位整数和32位浮点数相加。另一方面,C语言允许在表达式中混合使用基本数据类型。在单独一个表达式
中可以组合整数、浮点数,甚至是字符。当然,在这种情况下C语言编译器可能需要生成一些指令将某些操作数转换成不同类
型,使得硬件可以对表达式进行计算。例如,如果对16位int型数和32位long int型数进行加法操作,那么编译器将安排把16位
int型值转换成32位值。如果是int型数据和float型数据进行加法操作,那么编译器将安排把int型值转换成为float格式。这个转
换过程稍微复杂一些,因为int型值和float型值的存储方式不同。因为编译器可以自动处理这些转换而无需程序员介入,所以这
类转换称为隐式转换(implicit conversion)。C语言还允许程序员通过使用强制运算符执行显式转换(explicit conversio
n)。首先讨论隐式转换,,执行隐式转换的规则有些复杂,主要是因为C语言有大量不同的基本数据类型(6种整型和3种浮点
型,这还不包括字符型)。
当发生下列情况时会进行隐式转换:
.当算术表达式或逻辑表达式中操作数的类型不相同时。(C语言执行所谓的常用算术转换。)
.当赋值运算符右侧表达式的类型和左侧变量的类型不匹配时。
.当函数调用中使用的参数类型与其对应的参数的类型不匹配时。
.当return语句中表达式的类型和函数返回值的类型不匹配时。
隐式类型转换规则:
C语言自动转换不同类型的行为称之为隐式类型转换 ,转换的基本原则是:低精度类型向高精度类型转换,具体是:
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double
注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsigned int的精度就会比long的精度高
(事实上大多数针对32机的编译器都是如此)。另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升
到int也可能被提升到unsigned int。
提升数据的精度通常是一个平滑无损害的过程,但是降低数据的精度可能导致真正的问题。原因很简单:一个较低精度的
类型可能不够大,不能存放一个具有更高精度的完整的数据。一个1字节的char变量可以存放整数101但不能存放整数12345。
当把浮点类型数据转换为整数类型时,他们被趋零截尾或舍入。
当把有符号操作数和无符号操作数整合时,会通过把符号位看成数的位的方法把有符号操作数"转换"成无符号的值.这条
规则可能会导致某些隐蔽的编程错误。
假设int型的变量i的值为-10,而且unsigned int型的变量u的值为10。如果用<运算符比较变量i和变u,那么期望的结果
应该是1(真)。但是,在比较前,变量i转换成为unsigned int类型。因为负数不能被表示成无符号整数,所以转换后的数值
将不再为-10,而是一个大的正数(将变量i中的位看作是无符号数).因此i
由于此类陷阱的存在,所以最好尽最避免使用无符号整数,特别是不要把它和有符号整数混合使用。
强制类型转换:
通常我们应该避免自动类型转换,当我们需要手动指定一个准确的数据类型时,我们可以用强制类型转换机制来达到我们的目
的,使用方法很简单,在需要强制转换类型的变量或常量前面加上(type),例如(double)i; 即把变量 i 强制转换成double型。