查看Java Doc for Long,它只有两个构造函数:
1) primitive long as param --> new Long(10L);
2) String as param --> new Long("23");
但这很有效 新龙(23);
但是如果文字超过int MAX VALUE(2147483647),则L后缀成为必需的,因此: new Long(2147483648)现在需要在值
之后的L然而: new Long(Integer.MAX_VALUE + 1)没问题
谁可以解释一下?
答案 0 :(得分:4)
问题的第一部分很简单:允许int
传递所需的long
,因为任何可以表示为int
的数字也可以表示为{{ 1}}。这是所谓的扩展转换。
关于long
的第二部分比较棘手。虽然这里也发生了扩大转换,但它并没有人们想到的价值:如果你运行这个程序
new Long(Integer.MAX_VALUE + 1)
你得到的是Long x = new Long(Integer.MAX_VALUE + 1);
System.out.println(x);
,而不是预期的-2147483648
,因为加2147483648
时int
溢出了。
在执行添加之前,编译器不够智能,无法将表达式的某些部分提升为long
。在执行添加之后,对添加溢出的结果进行加宽转换。
答案 1 :(得分:0)
您可以在javadocs中找到答案:
在strictfp表达式(第15.4节)中,从整数类型到另一个整数类型或从float到double的扩展原语转换根本不会丢失任何信息;数值完全保留。
整数值23
可以转换为长23L
而不会丢失任何信息。因此,通过使用扩展原始转换,JVM会隐式将其转换为23L
。
所以当你打电话
new Long(23)
变成
new Long(23L)
答案 2 :(得分:0)
当我们写new Long(23)
时,您可以将其视为以下情况:
int i = 23;
long l = i; // widening primitive conversion
Long newLong = new Long(l);
根据JLS 5.1.2允许扩展转化次数,因此没有任何问题。
当我们尝试new Long(2147483648)
时,第一步本身就会失败,因为价值高于int
int i = 2147483648; // doesn't fit in int
当我们尝试new Long(Integer.MAX_VALUE + 1)
时,您可以将其视为以下情况:
int i = Integer.MAX_VALUE + 1; // This gives the INTEGER.MIN_VALUE -2147483648
long l = i ; // widening primitive conversion
Long newLong = new Long(l);
所以,这是允许的。希望这会有所帮助。
答案 3 :(得分:0)
差异来自于否使用文字。
使用文字,
long1 = new Long(2147483648)
代码将无法编译,因为编译器再次检查文字的有效性,接收文字值的变量类型2147483648
超出int
的范围。
因此编译器会发出错误。
它适用于任何文字。
作为compiler expects to have a specific type as value of the literals,所以它会进行检查:
文字的类型确定如下:
以L或l结尾的整数文字(第3.10.1节)的类型很长 (§4.2.1)。
任何其他整数文字的类型是int(§4.2.1)。
...
通过使用计算:
long1 = new Long(Integer.MAX_VALUE + 1);
编译器不会检查Long
参数构造函数的大小是否在int
范围内。
这不是文字宣言
在运行时,会发生int
到long
扩展原语转换。
它产生int
Integer.MAX_VALUE + 1
-2147483648
int
(溢出long
),转换为python_mission = """
The mission of the Python Software Foundation is to promote, protect,
and advance the Python programming language, and to support and
facilitate the growth of a diverse and international community of
Python programmer
"""
print(“The word returned is: {}”.format(python_mission[25:34]))
值。