Java 为什么编译器将long强制转换为int?

Java 为什么编译器将long强制转换为int?,java,long-integer,Java,Long Integer,为什么第4行输出:1410065408而不是1000000000 为什么第9行是编译错误?编译器不能创建Long,因为预期的类型是Long?默认情况下,整数文本是ints——这意味着它们遵循int算术,并且不能表示大于int所能容纳的数字。请注意,在第4行中,首先将两个整数相乘(使用整数算术),然后才将结果转换为long——但此时为时已晚,溢出已经发生 要放置一个long文本,只需将L附加到它: 1 public class Foo { 2 public static void main(S

为什么第4行输出:1410065408而不是1000000000


为什么第9行是编译错误?编译器不能创建
Long
,因为预期的类型是
Long

默认情况下,整数文本是
int
s——这意味着它们遵循int算术,并且不能表示大于
int
所能容纳的数字。请注意,在第4行中,首先将两个整数相乘(使用整数算术),然后才将结果转换为
long
——但此时为时已晚,溢出已经发生

要放置一个
long
文本,只需将
L
附加到它:

1 public class Foo {
2   public static void main(String[]a){
3       foo(1000000000); // output: 1000000000
4       foo(1000000000 * 10); // output: 1410065408
5       foo((long)1000000000 * 10); // output: 10000000000
6       
7       long l = 1000000000 * 10;
8       foo(l); // output: 1410065408
9       //long m = 10000000000; // compile error
10  }

    static void foo(long l){
        System.out.println(l);
    }
}

(小写字母“l”也可以编译,但它看起来像一个数字“1”,所以你应该避免使用它;使用大写字母“l”使其突出)。

默认情况下,整数文本是
int
s——这意味着它们遵循int算术,并且不能表示大于
int
所能容纳的数字。请注意,在第4行中,首先将两个整数相乘(使用整数算术),然后才将结果转换为
long
——但此时为时已晚,溢出已经发生

要放置一个
long
文本,只需将
L
附加到它:

1 public class Foo {
2   public static void main(String[]a){
3       foo(1000000000); // output: 1000000000
4       foo(1000000000 * 10); // output: 1410065408
5       foo((long)1000000000 * 10); // output: 10000000000
6       
7       long l = 1000000000 * 10;
8       foo(l); // output: 1410065408
9       //long m = 10000000000; // compile error
10  }

    static void foo(long l){
        System.out.println(l);
    }
}

(小写字母“l”也可以编译,但它看起来像一个数字“1”,因此您应该避免使用它;使用大写字母“l”使其突出)。

除非另有规定,否则文字默认为int。与使用
(long)
进行强制转换不同,您可以在文本末尾添加
L
,以注意它应该是
long
类型,就像
1.1
双精度
1.1f
浮点型
一样

long m = 10000000000L;


除非另有规定,否则文本默认为int。与使用
(long)
进行强制转换不同,您可以在文本末尾添加
L
,以注意它应该是
long
类型,就像
1.1
双精度
1.1f
浮点型
一样

long m = 10000000000L;


在java中执行任何操作时,编译器都会尝试对操作数进行隐式转换,将它们转换为更大的数据类型。(int/int=结果始终为int)

如其他答案所示,向文本添加显式强制转换(默认为
int
):

long m = 10000000000L;

在java中执行任何操作时,编译器都会尝试对操作数进行隐式转换,将它们转换为更大的数据类型。(int/int=结果始终为int)

如其他答案所示,向文本添加显式强制转换(默认为
int
):

long m = 10000000000L;
奇怪的是,(int*int)在溢出int时没有提升到长结果。奇怪的是,(int*int)在溢出int时没有提升到长结果。