类型隐式转换

台湾某著名CPU生产公司2005年招聘中有一个面试题为:下面程序的结果是什么?

char foo(void)

{

    unsigned int a=6;

int b=-20;

char c;

(a+b>6)?(c=1):(c=0);

return c;

}

------------------------------------------------------

解析:结果为1。这是因为无符号数(unsigned int)和有符号数(int)相加,系统会自动把有符号数转化为无符号数类型(unsigned int)。因此题中的a+b的值不是-14,而是一个unsigned int类型的数:42949673820xfffffff2)。因此返回值c1

   C++定义了一组内置类型对象之间的标准转换,在必要时编译器可以隐式地应用到对象上。隐式类型转换发生在下列典型情况下:

1、在混合类型的算术表达式中:这种情况下最宽的数据类型成为目标转换类型(即算术转换)。

int ival=3;

double dval=3.14159;

若有ival+dvalival会被自动转化为double类型的3.0

2、用一种类型的表达式赋给另一种类型的对象:在这种情况下目标转化类型是被赋值对象的类型。

如:int *pi=0 ;//int类型的文字常量0将被自动转化为int *型的指针表示空地址。

ival=dval ;//double类型的dval将被自动转化为int型的值。

3、把一个表达式传递给一个函数,调用表达式的类型与形式参数的类型不相同:这种情况下目标转换类型是形式参数的类型。(实际上还是属于上述第2中情况下的应用)

如:extern double sqrt(double) ;

cout<<"The square root of 2 is "<<sqrt(2)<<endl;  //实参2将被转化为double型的2.0.

4、从一个函数返回一个表达式的类型与返回类型不相同在这种情况下返回的表达式类型自动转换为函数类型。

如:

double difference(int ival1,int ival2)

{

       return ival1-ival2;  //返回值被自动转化为double类型

}

------------------------------------------------------

算术转换的两个指导原则为:

1、为防止精度丢失,如果有必要的话类型总是被提升为较宽的类型;

2、所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型。

 

 

 

参考资料:《程序员面试宝典》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值