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取值范围

  • 相关阅读:
    进程池,线程池,协程,gevent模块,协程实现单线程服务端与多线程客户端通信,IO模型
    线程相关 GIL queue event 死锁与递归锁 信号量l
    生产者消费者模型 线程相关
    进程的开启方式 进程的join方法 进程间的内存隔离 其他相关方法 守护进程 互斥锁
    udp协议 及相关 利用tcp上传文件 socketserver服务
    socket套接字 tcp协议下的粘包处理
    常用模块的完善 random shutil shevle 三流 logging
    day 29 元类
    Django入门
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665741.html
Copyright © 2011-2022 走看看