Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何区分int和long?_Java_Int_Long Integer - Fatal编程技术网

Java 如何区分int和long?

Java 如何区分int和long?,java,int,long-integer,Java,Int,Long Integer,对我来说,这看起来很模棱两可 整数范围内的数字可以是长的,这可以通过声明num来演示 我很好奇如果我有两种不同参数的方法会发生什么 显然,在编写参数时,数字的末尾必须有一个L,以表示它是长的,而在声明num时,这是不必要的。 为什么会这样 我首先想到,如果它在一个int的范围内,它会自动认为它是一个int,当它超过这个范围时,它会被用作一个long。 但是,对于我的第二个参数,它不会通过,除非我把L放进去。它说它不在int的范围内 有人能给出一些明确的规则吗?没有小数点的数字文字总是被视为int

对我来说,这看起来很模棱两可

整数范围内的数字可以是长的,这可以通过声明num来演示

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

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

我首先想到,如果它在一个int的范围内,它会自动认为它是一个int,当它超过这个范围时,它会被用作一个long。 但是,对于我的第二个参数,它不会通过,除非我把L放进去。它说它不在int的范围内


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

没有小数点的数字文字总是被视为
int
,除非它的后缀另有规定(如L)

如果超出int的范围,则这是一个编译错误

在声明num时,这不是必需的


您可以为长变量指定一个int文本,因为不会丢失信息。

您关心的问题是有效的。看看这个场景:

 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;
     }

 }
在这种情况下,如果调用以下命令,将得到不同的结果:

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

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

}
第一次调用会给您带来错误,因为默认情况下没有后缀(您创建了一个整数),这将能够适应两个重载方法


一些附加信息

  • 如果没有后缀
    l
    ,默认的整数值将是
    整数
  • 如果没有后缀
    d
    ,默认的十进制值将是一个
    double

引用Java语言规范:

如果整数文字以ASCII字母
L
L
作为后缀,则其类型为
long
否则为
int
()类型

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

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

如果浮点文本的后缀是ASCII字母
F
F
,则它的类型为
float
否则,其类型为
double
,并且可以选择使用ASCII字母
D
D
()作为后缀

因此,十进制数是一个
双精度
,除非以
f
结尾

  • int
    long
    float
    double

  • float
    double

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

在您的例子中,编译器更喜欢第一个方法,因为它可以在不进行任何转换的情况下被调用


如果第一个方法不存在,则在第一个参数隐式转换为
long
后,将调用第二个方法。没有小数点和后缀的数值文本,例如
42
100
始终是
int
类型。要使其成为
,必须添加后缀:
42L
100L

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

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

关于你的问题,我想了几点,
1.变量声明为长,则无需将L作为变量值
2.如果要传递一个硬编码的数字文字,请将L放在末尾以使其变长,否则所有数值都将被视为int(如果后缀不正确)
3.您可以传递int代替long参数(将发生自动加宽)
4.如果没有显式强制转换,则无法通过窄类型代替宽类型
5.参数转换可以通过显式转换和自动加宽进行,而不考虑数值大小

对于下面的代码示例,由于自动加宽和缺少
专用静态无效方法(INT a,INT b)


希望能有帮助

我明白了。因此,除非有后缀,否则默认值为int?带小数点,默认值是否为double?@JohnDoe yes。类似地,带有浮点的文字(如1.0)也是双精度的。
xMethod(1, 1)  --> xMethod(int n, long x) is called
xMethod(1L, 1) --> xMethod(long n, long x) is called
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 ");
    }