以下是什么区别?
long var1 = 2147483647L;
long var2 = 2147483648;
(或任何原始变量声明) 无论是否有L,它是否有任何性能问题?这是强制性的吗?
答案 0 :(得分:10)
在第一种情况下,您要将long
字面值分配给long
变量(L
或l
后缀表示long
类型)。
在第二种情况下,您要为int
变量分配long
字面值(这是没有提供后缀时的默认类型)(这导致从int
自动进行类型转换long
),表示您受限于Integer.MIN_VALUE
到Integer.MAX_VALUE
(-2147483648
到2147483647
)的范围。
这就是
的原因long var2 = 2147483648;
未通过编译(2147483648
大于Integer.MAX_VALUE
)。
另一方面
long var2 = 2147483648L;
会通过编译。
答案 1 :(得分:3)
为了便于理解,每个类型都有java中的范围。
默认情况下,您在java中输入的每个数字都是byte
或short
或integer
。
short s = 32767;
byte b = 127;
int i = 2147483647;
因此,如果您指定除范围之外的任何内容,您将收到编译错误。
int i = 2147483648; //compilation error.
当你写长 longNumber = 2147483647;
虽然它属于 long 范围,但内部java将其视为
long l = (int) 2147483647;
你不会有任何错误。
但是如果我们分配超出整数范围之类的
longNumber = 2147483648;
我们将收到编译错误
long o = (int) 2147483648;
这里java会尝试将2147483648转换为 int ,但它不在 int 范围内,因此抛出了更大的错误。 要指示java我们编写的数字超出整数范围,只需将 l 或 L 附加到数字的末尾。 所以java会将他的范围扩展到很长时间并将其转换为
long o = (long) 2147483648;
默认情况下,每个具有浮点(。)的浮点或数字都是double的大小。因此,当您使用(。)java写一些数字时,将其视为double,并且必须在double范围内。 我们知道 float 范围小于 double 。 所以当你写作
float f = 3.14;
虽然它属于双倍范围,但内部java将此赋值视为
float f = (double) 3.14;
此处您将 double 分配给 float 缩小,这是不正确的。 所以要么你必须像这样转换表达式
float f = (float)3.14;
or
float f = 3.14f; // tell jvm to assign this in float range by appending **f** or **F**
答案 2 :(得分:2)
如果我们没有提及带有值的L
,那么值将被视为int
值。
它会自动将int
投射到long
。