zoukankan      html  css  js  c++  java
  • 类型转换

    这今天有朋友面试遇到一个题是这样的

    int main()
    {
        unsigned int a = 6;
        int b = -20;
        a + b > 6? puts(">6"):puts("<=6");
        return 0;
    }
    

      问你说出结果

    如果你不了解隐式类型转换,你很大可能说 <= 6

    结果是 .>6

    哎,我就深入理解类型转换吧

    所谓类型转换就是一种数据类型转换成为另一种数据类型

    在一个算术表达式中,如果出现两个不同数据类型,就会先进性类型转换,在计算表达式的值

    比如

    cout << 34 + 21.45 + 'a' << endl;

    34 是int,21.45是double,'a'是char类型。
    运算的过程如下 34会先转换成double类型 34.00,再完成34.00+21.45的
    运算,得到当前结果 55.45 ,然后将 'a' 转换成double类型,97.00
    再计算 55.45 + 97.00 得到最终结果 152.45

    而类型转换分为隐式类型转换和显示类型转换。
    c++中类型转换发生在,算术表达式计算,函数参数传递,函数返回值及赋值语句中

    我们先谈谈隐式类型转换吧
    下面四种情况会发生隐式类型转换
    定义:
    c++会自动对参与运算的数据类型进行转换,不需要人参与叫隐式类型转换

    1.同一算术表达式中出现了多种数据类型。
    转换规则是:
    尽可能避免精度损失,因此窄数据(占用内存小的类型)向宽数据(占用内存大的类型)转换具体如下

    其中整数是从小整数转换为大整数
    short,unsigned short;
    bool ,char,signed char,unsigned char
    只要表达式出现这些,如果对应的变量可以用int来存,都会首先转换为int
    如果超出int就提升为unsigned int

    2.变量赋值时也会出现隐式类型转换
    例如
    int a = 2;
    float b = 3.4;
    double c = 2.2;
    b = a;将a转换为float 2.0 再赋值给b
    a = c; 将c的值2.2转换为int 2 再赋值给a

    上面出现了两种情况
    2.1 b = a 窄数据(占用内存小的类型)向宽数据(占用内存大的类型)转换

    2.2 a = c 宽数据向窄数据转换
    显然第二种会损失精度,是不安全的。
    c++采取截取方法进行 宽数据向窄数据转换

    a = c 会截取c的int部分 2 赋值给a

    3.函数调用过程中,如果实参与形参类型不符,则把实参类型转换为形参类型

    4.函数返回时,如果返回表达式的值和函数声明返回类型不符,则
    把表达式类型转换为函数声明返回的类型,例如

    float Min(int a,int b)
    {
    return a < b? a:b;
    }

    会把int转换为float 再返回给Min函数

    然后显示类型转换:

    定义:

    可以人为地强制转换

    (type) var;

    或 type (var)

     然后我们再说说刚开始那题,为啥是 > 6;

    int < unsigned 所以发生隐式类型转换。但是呢-20这尼玛就溢出了呀

    你输出 a + b的结果是 4294967282 为什么是这么多?你需要了解下面这两个就够了

    关于整数溢出的规则以及 unsigned的范围 就知道了

    自行百度吧

  • 相关阅读:
    zlib 用了很多次,这次记下来
    boost 1.53 比1.52 ASIO bug 修正
    64位汇编
    js C++
    这个split 不错 我喜欢的
    布6月26日至28日将在旧金山召开2013年Build大会
    asio同步模式和异步模式
    vc6 编译boost
    windows 编译mongodb 2.4
    ajaxToolKit中 的折叠面板用法Accordion
  • 原文地址:https://www.cnblogs.com/mch5201314/p/11688319.html
Copyright © 2011-2022 走看看