类型转换(1)— 隐式转换

1、发生隐式转换的情况

  • 混合类型表达式中,转换为相同的类型
    int ival = 2;
    double dval = 2.1;
    ival >= dval;  //int型转换为double型

  • 条件表达式转换为bool类型
    if(ival)      //int型转换为bool型
    {
      //body
    }

  • 初始化或赋值某个变量时,转换为给变量类型
    int ival = 3.14;  //3.14 convert to int 3
    int *p; p = 0;    //int 0 convert to pointer null

2、算术转换规则

(1)有符号无符号类型之间的转换:这类转换的本质依赖于机器

  • short和int表达式,short转为int;
  • 如果int型足够表示所有unsigned short型的值,则将unsigned short转换为int,否则将两个操作数均转换为unsigned int 型。如short型用半字表示,int型用一个字表示,则所有unsigned short值都包含在int内,则unsigned short转换为int;
  • 如果long型足够表示所有unsigned int型的值,则将unsigned int转换为long,否则将两个操作数均转换为unsigned long 型;
  • signed和unsigned的表达式,signed转换为unsigned。但是当signed类型恰好存储的是负数时,将产生意料之外的后果。如
    signed val = -1;
    unsigned nval = 2;
    if(nval >= val){
    	cout<<"ok"<<endl;
    }else{
    	cout<<"error"<<endl;
    }

    输出结果是error。原因是val=-1,转化成unsigned型的结果是该负数对该类型取值个数求模的值,所以val转换为unsigned型后为255。

(2)整型提升:最简单的一种转换

对于所有比int小的整型,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包容在int内,他们都会被提升为int型,否则它们将被提升为unsigned int。

          考虑,unsigned short 类型是两个字节。unsigned类型是四个字节,long在32位机上也是四个字节。则下边的代码运行结果是什么?输出结果见注释。

     unsigned short us1 = 65534;
     unsigned short us2 = 2;
     unsigned uint = us1+us2;
     cout<<"uint =  "<<uint<<endl;                      //ok,uint = 65536
     cout<<us1<<" + "<<us2<<" = "<<us1+us2<<endl;       //ok,65534 + 2 = 65536
         
    unsigned  us1 = 4294967294;
    unsigned  us2 = 3;
    double ul = us1+us2;
    cout<<"uint =  "<<ul<<endl;				//u1=1
    cout<<us1<<" + "<<us2<<" = "<<us1+us2<<endl;	//us1+us2=1

(3)由标准库类型定义的转换:类类型可以定义由编译器自动执行的数据转换。
string s;
while(cin>>s);
上边的例子,while循环条件应为bool类型值,但cin>>s返回的是istream类型的值,将istream类型值转换为bool类型意味着要检验流的状态。

(4)其他隐式转换

指针转换,转换为bool类型,算术类型与bool类型的转换,与枚举类型的转换,转换为const对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值