zoukankan      html  css  js  c++  java
  • java中整数的默认为int类型的一些问题

    thingking in java 读书感悟
    
    作者 :淮左白衣
    
    写于2018年4月8日17:51:44
    


    关于整数的默认类型,以及会产生的一些小问题

    在java中,整数 默认是 int 类型,小数 默认是 double 类型 ;因此,在一些地方会造成一些错误;

    • 比如下面的代码。在编译的时候,是报错的:
     long num = 99999999999999;  // error

    原因:因为整数默认是int类型,但是 99999999999999 明显的超出了 int 的取值范围;因此,这里就会报错,我们需要在整数后面加上一个 L ,告诉编译器,这是一个 long 类型数字 ;

    long num = 99999999999999L;  // ok
    • 下面的代码,我们思考下原因:
            byte a = 127 ;       // ok
            byte b = -128 ;      // ok
            byte c = a + b ;     // error
    
            byte d = 3 + 5 ;      // ok
            byte e = 125 + 5 ;    // error
    
            byte f = (byte) (127 + 5);   // ok
            System.out.println(f);   // output : -124
    
            byte g = 8 ;
            g = g + 10 ;       //error
            g += 10 ;          // ok

    你可能会有一些疑问:

    1. byte a = 127 ; // 为什么代表 int 类型的整数,可以直接赋值给 byte

      byte的取值范围: -128 ~ 127 ;我们一般向下转型的时候,会产生丢失进度的问题,但是,当我们使用明明确确的 整形常量: -128~127 ;将它们赋值给byte的时候,是不错产生这样的错误的,因为,它们的确是byte的取值范围 ;编译器,是认识常量值的,知道它们的值是 byte 的合法取值范围 ;因此,java允许这样的赋值 ;

    2. byte c = a + b ; // error

      为什么,这里又错了呢?因为 a 和 b 都是 变量。编译器虽然可以确定 a 和 b 两个变量的值,都是byte的取值范围,但是由于他们是变量,变量相加的值,编译器在编译器期间是无从得知的,也就是说,到底会不会超过byte的取值范围,编译器是不确定的 ;因此,报错 ;

    3. byte d = 3 + 5 ; // ok
      byte e = 125 + 5 ; // error

      3 + 5 OK 的原因是:编译器是认识常量值的,知道 3 + 5 = 8 ;还没有超过byte的取值范围 ;同样的道理,编译器发现了 125 + 5 = 130 ;超过了byte的取值范围了,因此,报错 ;

    4. byte f = (byte) (127 + 5); // ok
      System.out.println(f); // output : -124

      输出为什么是 -124 ;我们可以把byte的取值范围想象成一个表盘表盘的正上方是 0 ;表盘的正下方是 - 128 和 127 ;对 byte 进行加减操作的时候,类似于在表盘上移动 ;当127 + 5 的时候,就移动到了 -124 的位置了 ;

    5. byte g = 8 ;
      g = g + 10 ; //error
      g += 10 ; // ok

      首先 g = g + 10 ;错误的原因,跟第二条是一样的,由于 g 是个变量,编译器无法得知它和10相加完的具体值 ,是否产生溢出,因此报错;

      大家可能都听别人说 g = g + 10 ; 与 g += 10 ; 是等价的 ;;其实 它们不是完全等价的, += 操作符,会默认帮我们进行强转 ;这也解释了 g += 10 ; 是正确的原因 ;底层有个自动强转在里面 ;


    涉及基本数据类型的重载

        public void aha(char b){}
        public void aha(byte b){}
        public void aha(short b){}
        public void aha(int b){}
        public void aha(long b){}
        public void aha(float b){}
        public void aha(double b){}
    

    当我们想要调用 aha( ) 方法的时候,编译器会根据参数进行选择调用哪一个方法;

    但是当没有参数,与我们传入的参数匹配的时候,编译器会将我们传进去的参数进行向上提升

    一般都是向上一个类型一个类型的提升,比如byte,先提升到short ,没有合适的,再提升到int 等等,以此类推 ;

    其中char,有点特殊;如果没有匹配的话,则直接提升到 int类型

    这里需要注意,long 会被 提升为 float因为,float 的取值范围是大于 long 的 ; 至于原因,可查看我的另一篇博客: floa取值范围为什么比 long取值范围

  • 相关阅读:
    算法导论13:双向循环链表 2016.1.13
    ansible
    mariadb集群配置(主从和多主)
    连接查询,视图,事物,索引,外键(第四章)
    MariaDB第三章(select)
    mariadb第二章-增删改
    mariadb(第一章)
    keepalived概述
    git操作
    django后台admin管理布局
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665741.html
Copyright © 2011-2022 走看看