• 自动类型转换与强制类型转换


    这整理了下之前刷题遇到的问题,发现自己对于自动、强制类型转换的逻辑理解不够透彻

    专门研究了下。

    先来看下引起我疑问的代码

     1 // leetcode 第9题,回文数
     2     public boolean isPalindrome(int x) {
     3         if (x<0) return false;
     4          long res = 0,temp=x;
     5          while(temp!=0){
     6              res=res*10+temp%10;
     7              temp=temp/10;
     8          }
     9          return (int)res==x ? true:false;
    10      }
    11 
    12 
    13     // leetcode 69题   x的平方根
    14     public int mySqrt(int x) {
    15         int left = 1,right = x,mid=0,res=0;
    16         while(left<=right){
    17             mid=left+(right-left)/2;
    18             if((long)mid*mid<=x){
    19                 res=mid;
    20                 left=mid+1;
    21             }else{
    22                 right=mid-1;
    23             }
    24         }
    25         return res;
    26     }
    27     
    28     // leetcode  第98题 验证
    29     Long min = Long.MIN_VALUE;
    30     public boolean isValidBST(TreeNode root) {
    31        if(root==null){
    32            return true;
    33        }
    34 
    35        if(!isValidBST(root.left)){
    36            return false;
    37        }
    38 
    39        if(root.val<=min){
    40            return false;
    41        }
    42        min = (long)root.val;
    43 
    44        return isValidBST(root.right);
    45     }

    上面3个方法中都出现了强制类型转换,用途却存在一定的差异

    下面我们先来梳理一下什么是类型转换的2种形式,强制类型转换和自动类型转换

    (1)自动类型转换

    即,范围小的类型可以直接赋值个范围大的类型,例如

    1         int a = 1;
    2         // int可转换为long、float和double; 
    3         long b = a;
    4         // long可转换为float和double; 
    5         float c = b;
    6         // float可转换为double;
    7         double d = c;

    将小范围的值赋值给大范围的类型,不存在精度损失的情况,因此可以直接赋值

    (2)强制类型转换

    自动类转换是将小范围的值赋给大范围的类型,强制类型转换则相反,是将大范围

    的类型赋值给小范围的值,我们将上面的例子反过来看下。

    1         double d = 2.75d;
    2         float c = (float)d;
    3         long b = (long)c;
    4         int a = (int)b;

    (3)二元运算符对计算结果的影响

    其规则为

    1、如果2个操作数有1个为Long,则结果为Long

    2、没有long时,结果为Int,即使2边全为short、byte

    3、2个操作数只要有1个是double,则结果为double

    4、2个操作数都为float时,结果才为float

    结合以上几点,我们再来看开头抛出的几个方法中对类型转换的应用

    long res = 0,temp=x;
    return (int)res==x ? true:false;

    首先int类型的变量可以直接赋值给long类型的变量,不会损失精度

    其次,显然x发翻转后的值可以完整的保存在long类型的变量中,需要强转为Int才能判断是否溢出

    if((long)mid*mid<=x)

    这里由于2测都是int类型,mid*mid在溢出情况下条件依然成立,因此需要强转为long类型来协助比较大小

    min = (long)root.val;

    这里则是最简单的由大转小的类型转换。

    我们可以总结一下

    (1)不同类型的值可以直接比较,不涉及类型转换

    (2)二元运算符会自动将小的类型转换为大的类型

    (3)比较运算符不涉及类型转换,因此在考虑溢出的情况时需要手动实现强制类型转换

    争取早日不再是一只菜鸡
  • 相关阅读:
    ThinkPHP5.0被攻击,发现漏洞
    ThinkPHP5.0引用PHPExcel插件,在页面中导出数据库数据
    ThinkPHP5.0引入插件
    引入UEditor插件
    Form
    点击链接只跳转到首页/本地正常,上传后,除首页外,其余页面404
    Thinkphp5中嵌套循环
    ARouter转场动画无效,试试下面这种写法
    windows下运行.sh文件
    List集合增删元素时,UnsupportedOperationException报错问题
  • 原文地址:https://www.cnblogs.com/jchen104/p/15025358.html
Copyright © 2020-2023  润新知