【问题标题】:Casting an int into a long将 int 转换为 long
【发布时间】:2013-01-31 18:45:22
【问题描述】:

我有一个关于在 java 中从 int 转换为 long 的问题。 为什么浮点数没有问题:

float f = (float)45.45;//compiles no issue.
float f = 45.45f; //compiles no issue.

但是对于长类型来说,这似乎是个问题:

    long l = (long)12213213213;
    //with L or l at the end it will work though. 
    long l = (long)12213213213L;

似乎一旦编译器由于超出范围的问题而通知错误,它就会阻塞在那里,而不检查程序员可能计划的任何可能的转换。

你怎么看?为什么会这样,有什么特别的原因?

提前致谢。

【问题讨论】:

    标签: java int long-integer


    【解决方案1】:

    但是对于长类型来说这似乎是一个问题:

    这是因为没有L12213213213int,而不是long。并且由于该值超出了int 的范围,所以会出现错误。

    尝试类似:-

    System.out.println(Integer.MAX_VALUE);
    System.out.println(12213213213L);
    

    你会明白的。

    float的情况而言:-

    float f = (float)45.45;
    

    45.45double 值,适合double 的大小。所以,编译器不会有问题,然后它会执行castfloat

    似乎一旦编译器由于超出范围而通知错误 在没有检查任何可能的铸造的情况下将其阻塞在那里 程序员可能已经计划好了。

    没错。编译器首先检查一个有效值,这里是int,然后它才能通过强制转换操作进一步移动。

    所以,基本上在longint的情况下:-

    long l = (long)12213213213;
    

    您不会因为cast 操作而出错,而是因为您的numeric literal 不能表示为int。因此,编译器没有在那里得到有效值来执行强制转换操作。

    【讨论】:

    • 我明白,但是我的问题旨在了解为什么铸造 (long)12213213213;在这种情况下不考虑,而在 float f = (float)45.45; (请注意,如果没有强制转换,则会出现错误)正常工作。
    • @Rollerball.. 错误不是因为铸造。编译器没有机会到达那里。它仅在注意到12213213213 时停止,并说,嘿等等,这个数字不能表示为int。所以,它给你一个错误。这暗示了一个事实,一个结尾没有L的数字是int。所以,4int,但 4Llong
    • @每个阅读此评论的人。我完全理解错误的重点。但是,有人知道为什么编译器会在不检查强制转换的情况下停在那里吗?考虑到如果编译器已经看到了演员表,它就会起作用。
    • @Rollerball.. 好吧,让我们这样吧。要将值转换为类型,编译器首先需要一个有效值。然后只有它可以检查该值是否可以转换为类型。现在,由于它甚至没有获得int literal 的有效值,它如何随着演员阵容进一步发展?
    【解决方案2】:

    Java 不会只考虑值是什么。例如,如果您有一个太大的 long 值,那么将它分配给 double 并不重要,那么首先检查 long 值是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-13
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 2013-01-20
      相关资源
      最近更新 更多