对于我们来说,3+1.5=4.5。但是对于计算机来说,这两个数的相加可不这么简单。因为3与3.0是不同的数据类型,3.0与1.5是可以相加的,3却不能与1.5相加。于是,C++在对上面的表达式进行处理时,有必要对其中一个(或两者)进行转换。
因为这个转换是“隐式”的,也就是说这个转换不让程序员知道,那么,系统就不能必须保证不产生损失,这个损失指的是精度。为了不损失精度,数据总是向精度高的类型转换。惟一的例外是当某个变量用作条件时,它被转换为bool型。
对算术类型的转换是这样的:所有比int小的都转为int或unsigned int,即使没有必要也这么转。原因很简单,因为int的长度正好等于字长。对CPU来说,一次处理一个字是最快的。如果int或unsigned int无法达到要求,则往long、double转化。
如果每一个转换都能不造成损失,那自然是好事。可是世间的事总有不随人愿的时候。对于同一种算术类型,其signed和unsigned所能表达的范围是一样大,但却是互不重叠的两个范围。就像“妇联”和“工会”一样,往哪边转换都可能会产生损失。这是无法解决的问题,所以,在VC中,试图比较int和unsigned int变量时会显示警告。
奇怪的是,据我测试,在VC++.net中,只有进行“<”和“>”比较的时候才会显示警告,而进行“==”和“!=”比较的时候却不显示警告。实际上这两个比较也会有同样的问题产生,比如以下代码:
int a = -3;
unsigned b = 4294967293;
if (a == b) cout << "yes" << endl;
测试运行以上代码会发现表达式a==b的值为true。这是从int转为unsigned int过程中的副作用,这个副作用我们应该知道,但是VC++.net不进行任何警告似乎也有些与理不通。——难道我关闭了某些警告?
其它隐式转换还包括数组名转换为指针、算术值用作条件时转换为bool,枚举被转换为整数,非const对象转换为const对象等。其中枚举转换为整数没什么要提的,枚举值本来就是整数的别名,非const对象转为const对象只是临时声明它的保护级别,通常用于作为参数传递时。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
