c++类型转换

  1. bool类型的赋值给bool类型,初始值为0则结果为false,否则为true
  2. bool赋值给非bool得时候,初始值为false则结果为0,为true则结果为1
  3. 把浮点数赋值给整型,结果值仅保留浮点树中小数点之前的部分(整数部分)。注意可能因为整型位数不够而变成负数
  4. 把整型赋值给浮点数,如果整型超过了浮点数的位数限制,精度可能损失
  5. 赋值给无符号类型一个超过它表示范围的值时,结果是对初始值对无符号类型表示数值总数取数取模后的余数。
  6. 赋值给带符号类型一个超出它表示范围的值时,结果是未定义的
  7. bool值进行关系运算的时候,也会转换成0或者1
  8. 隐式转换发生的条件
    1. 大多数表达式当中,比int类型小的整型值首先提升为较大的整数类型
    2. 条件中,非布尔值转换成bool类型
    3. 初始化的初始值转换成变量的类型。赋值语句右侧转换成左侧
    4. 算术运算或者关系运算的运算对象有多种类型,需要转换成同一种类型
    5. 函数调用发生的类型转换
  9. 初始化过程中,初始值转换成变量的类型,赋值语句中,右侧对象转换成左侧运算对象的类型
  10. 算术或者关系运算有多种类型,需要转换成同一种类型
  11. 函数调用发生类型转换
  12. 算数转换
    1. 整型提升
    • 对于boolcharsigned charunsigned charshortunsigned short。只要他们可能的值都能存在int里,它们就都会提升成int类型。否则提升到unsigned int类型。
    • 较大的char比如wchar_tchar16_tchar32_t提升到intunsigned intlong,unsigned longlong longunsigned long long中最小的一种类型前提是转换后的类型要能容纳原类型所有可能的值
    char32_t a = 0xffffffff;
    char32_t b = -0xffffffff;
    // c是unsigned int
    auto c = a - b;
    // d是unsigned int
    auto d = a + b;
    
    1. 无符号类型的运算对象
    • 如果某个运算符的运算对象类型不一致,这么运算对象将转换成同一种类型。但是如果某个对象的类型是无符号类型,那么转换结果依赖各个整数类型的相对大小
    • 负数转换成unsigned类型的时候,会变成正数
    • 如果无符号类型不小于(这个大于的意思表示longint大这个意思)带符号类型,那么带符号的运算对象转换成无符号。比如unsigned intintint类型的运算对象转换成unsigned int
    • 如果带符号类型大于(这个大于的意思表示longint大这个意思)无符号类型,则依赖机器。如果无符号类型能存在带符号中,则无符号存在带符号中,如果不能那么带符号类型转换成无符号类型。longunsigned int并且二者大小相同,则long转换成unsigned int。如果long占用的空间比int更多则unsigned int转换乘long类型
  13. 指针转换
    1. 0nullptr可以转换成任意类型的指针
    2. 任何非常量的指针能转换成void*,任意对象的指针可以转换成const void*。有继承关系的类型之间还有另一种指针转换方式
    3. 编译器每次只能执行一种类型的转换,如果同时提出多个转换请求,这些请求将被拒绝
    4. 数组用作decltype关键字的参数,或者作为取地址符号&sizeof以及typeid等运算符的运算对象时,不会发生到指针的转换。或者使用数组的引用来初始化数组的时候也不会发生
    // arrRef引用arr
    int (&arrRef)[10]=arr;
    
  14. 强制类型转换
    1. 格式cast-name<type>(expression)
    2. type表示转换的目标类型而expression表示要转换的值。如果type是引用类型,则结果是左值。
    3. cast-namestatic_castdynamic_castconst_castreinterpret_cast中的一种
    4. static_cast,只要具有明确定义的类型转换(不能包含底层const)都可以使用static_cast。显示类型转换不会给出精度丢失warn

      不能包含底层const的原因如下
      static_cast<T>(x)的语义差不多是这样的:以x为参数构造一个T类型的返回值,这个转型的过程必需是在编译期可以确定的。
      如果有const int x=10
      static_cast<int>(x)是正确的,因为你可以从一个const int构造一个int
      static_cast<const int &>也是正确的,因为你可以依据const int获得一个const int &
      static_cast<int &>是不正确的,因为你不能从const int获得一个int &,此时必需用const_cast
      可以从const char *正常构造一个std::string,因为std::string有这么一个构造函数。
      但不能从const char *构造一个int,只能得到一个const int

    5. const_cast只能改变运算对象的底层const,并且不能改变类型
    const char *pc;
    // 正确,但是通过p写值是未定义行为
    char *p=const_cast<char*>(pc);
    
    1. reinterpret_cast为运算对象的位模式提供低层次上的重新解释
    int *ip;
    // 这时候pc会把其内容当作字符串来解释
    char *pc=reinterpret_cast<char*>(ip);
    
    1. 旧式强制类型转换。具有上述三种强制转换的功能
    // 函数形式的强制类型转换
    type (expr);
    // c语言风格的强制类型转换
    (type) expr;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值