宣布长变量与' L'之间的区别是什么?没有?

时间:2017-06-12 10:04:46

标签: java

以下是什么区别?

long var1 = 2147483647L;

long var2 = 2147483648;

(或任何原始变量声明) 无论是否有L,它是否有任何性能问题?这是强制性的吗?

3 个答案:

答案 0 :(得分:10)

在第一种情况下,您要将long字面值分配给long变量(Ll后缀表示long类型)。

在第二种情况下,您要为int变量分配long字面值(这是没有提供后缀时的默认类型)(这导致从int自动进行类型转换long),表示您受限于Integer.MIN_VALUEInteger.MAX_VALUE-21474836482147483647)的范围。

这就是

的原因
long var2 = 2147483648;

未通过编译(2147483648大于Integer.MAX_VALUE)。

另一方面

long var2 = 2147483648L;

会通过编译。

答案 1 :(得分:3)

为了便于理解,每个类型都有java中的范围。

  1. 默认情况下,您在java中输入的每个数字都是byteshortinteger

    short s = 32767;
    byte b = 127;
    int i = 2147483647;
    
  2. 因此,如果您指定除范围之外的任何内容,您将收到编译错误。

    int i = 2147483648;  //compilation error.
    

    Type range

    当你写 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; 
    
    1. 默认情况下,每个具有浮点(。)的浮点或数字都是double的大小。因此,当您使用(。)java写一些数字时,将其视为double,并且必须在double范围内。 我们知道 float 范围小于 double 。 所以当你写作

      float f = 3.14;

    2. 虽然它属于双倍范围,但内部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