如何区分int和long?

时间:2015-12-09 08:00:35

标签: java int long-integer

 public class NewMain
 {
     public static void main(String[] args)
     {
         long num = 100;
         System.out.println(xMethod(5,1000000000000L));

     }

     public static int xMethod(int n, long x)
     {
         System.out.println("int, long");
         return n;
     }

     public static long xMethod(long n, long x)
     {
         System.out.println("long, long");
         return n;
     }

 }

对我来说,这看起来很模糊。

整数范围内的数字可以是long,使用num。

的声明来证明

我很好奇如果我有两种不同参数的方法会发生什么。

显然,在编写参数时,数字必须在末尾有一个L表示它是长的,而在声明num时,这是不必要的。 这是为什么?

我首先想到的是,如果它在int的范围内,它会自动将其视为int,当它超出该范围时,它将被用作long。 但是,使用我的第二个参数,它不会通过,除非我把L。它说它不在int的范围内。

有人可以给出一些明确的规则吗?

5 个答案:

答案 0 :(得分:3)

没有小数点的数字文字始终被视为int,除非它具有指定其他方式的后缀(例如L)。

如果它超出int范围,则这是编译错误。

  

当声明num时,这是不必要的

您可以将int文字分配给长变量,因为不会丢失信息。

答案 1 :(得分:1)

引用Java语言规范:

  

3.10.1. Integer Literals

     

如果整数文字的后缀为ASCII字母longL(ell),则其类型为l; ,否则类型为int §4.2.1)。

     

后缀L是首选,因为字母l(ell)通常很难与数字1(一)区分开来。

因此,整数是int,除非以L结尾。由于1000000000000对于int而言太大,因此必须L结尾,否则会出现编译错误(" The literal 1000000000000类型的int超出范围")

  

3.10.2. Floating-Point Literals

     

浮点文字的类型为float,如果后缀为ASCII字母Ff; ,否则其类型为double ,并且可以选择以ASCII字母Dd§4.2.3)为后缀。

因此,十进制数是double,除非以f结尾。

  

5.1.2. Widening Primitive Conversion

     
      
  • intlongfloatdouble

  •   
  • floatdouble

  •   

因此,编译器将静默扩展(转换)int值为long如果需要

在您的情况下,编译器更喜欢第一种方法,因为它可以在没有任何转换的情况下调用。

如果第一种方法不存在,则在将第一个参数隐式转换为long后,将调用第二种方法。

答案 2 :(得分:1)

对于你的问题,我想到的几点很少 1.变量被声明为long,因此不需要将L作为变量值 2.如果要传递硬编码的数字文字,则将L放在末尾以使其长,否则所有数值都将被视为int(如果没有正确后缀)
3.你可以通过一个int代替长参数(自动加宽会发生)
如果没有明确的铸造,你就不能通过狭窄的类型代替更宽的类型 5.参数转换可以通过显式转换和自动加宽,而不考虑数值大小。

以下代码示例 - "内部INT LONG"将由于自动加宽而没有private static void aMethod(int a , int b)

而打印
public class IntVsLons {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int a =100;
        long b=200;

        aMethod(a,a);

        }

    /*
    private static void aMethod(int a , int b){
        System.out.println("Inside INT  INT  ");
    }
    */

    private static void aMethod(int a , long b){
        System.out.println("Inside INT  LONG ");
    }

    private static void aMethod(long a, long b ){
        System.out.println("Inside LONG LONG ");
    }

希望它有所帮助!!

答案 3 :(得分:0)

您的担忧是有效的。看看这个场景:

public static void methodX(long x, int y){

}
public static void methodX(int x, long y){

}

在这种情况下,如果您调用以下内容,它将为您提供不同的结果:

methodX(123, 123);    //Compilation error (reference to methodX is ambiguous)
methodX(123L, 123);   //Ok!
methodX(123, 123L);   //Ok!

第一次调用会给你错误,因为默认情况下没有后缀(你创建一个整数),它将能够适应两种重载方法。

一些额外信息

  • 如果没有l的后缀,则默认的整数值将为integer
  • 如果没有后缀d,则默认小数值为double

答案 4 :(得分:0)

没有小数点且没有后缀的数字文字(例如42100)始终为int类型。要使其成为long,您必须添加后缀:42L100L

如果调用方法,参数的实际(编译时)类型将确定调用哪个重载方法。如果可以使用给定类型调用多个重载方法,则将采用最具体的方法。 (对于确切的规则,请阅读JLS的第15.2节。)因此,在您的情况下,如果第一个参数是int,则将调用第一个方法重载,因为int是更具体的是long

xMethod(1, 1)  --> xMethod(int n, long x) is called
xMethod(1L, 1) --> xMethod(long n, long x) is called