【问题标题】:The literal xyz of type int is out of rangeint 类型的字面量 xyz 超出范围
【发布时间】:2011-10-28 22:07:36
【问题描述】:

我目前正在使用 Java 中的数据类型,如果我理解正确,long 类型接受介于 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的值。现在如下所示,我创建了一个名为 testLonglong 变量,尽管当我插入 9223372036854775807 作为值时,我收到一条错误消息:

int 类型的字面量 9223372036854775807 超出范围。

我不知道为什么它将long 数据类型称为int

有人有什么想法吗?

代码:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;

【问题讨论】:

  • 顺便问一下:你用的是什么编译器? Eclipse 和 Sun JDK 编译器都针对这个问题给出了不同的(我认为更好)错误消息。

标签: java int long-integer


【解决方案1】:

在末尾添加大写L

long value = 9223372036854775807L;

否则,编译器将尝试将文字解析为int,因此会出现错误消息

【讨论】:

  • 它在 Java 语言规范中。查找全文here
  • @Lukas,长值 = 00000077029062100L;给了我同样的错误,它小于 19 位。任何想法为什么它会抛出“long 类型的文字 0000007702062100L 超出范围”
  • @SantosshKumhar:这是一个octal literal,它不能包含数字89。删除前导零。
【解决方案2】:

我不知道为什么它把 long 数据类型称为 int

事实并非如此。您应该学会信任编译器消息(尤其是当它们来自理智的现代编译器,而不是往往有错误消息的古老编译器时)。虽然他们说的语言有时可能难以辨认,但他们通常不会对你撒谎。

让我们再看一遍:

int 9223372036854775807 的字面量超出范围。

请注意,它没有在任何地方提及您的变量testLonglong 类型,因此问题与初始化有关。它似乎发生在其他时间。

现在让我们研究一下消息的一些部分:

  • int 告诉我们他想将某些东西视为 int 值(这不是您想要的!)
  • “超出范围”非常明确:某些内容不在预期范围内(可能是int
  • “文字”:现在有趣了:什么是文字?

我将暂时离开舒适的列表来讨论文字:文字是您在代码中具有某些价值的地方。有String 字面量、int 字面量、class 字面量等。每次您在代码中明确提及 时,它都是文字。

所以它实际上并不是在唠叨变量声明,而是数字本身,值就是它在唠叨你的东西。

您可以通过在longint 同样可接受的上下文中使用相同的文字轻松验证这一点:

System.out.println(9223372036854775807);

PrintStream.println 可以采用 an inta long(或几乎其他任何东西)。所以那段代码应该没问题吧?

没有。好吧,也许它应该是,但根据规则它不好。

问题是that "some digits" is defined to be an int literal,因此必须int定义的范围内。

如果你想写一个long 文字,那么你必须通过附加L(或小写l,但我高度建议你总是使用大写-case 变体,因为它更容易阅读并且更难误认为1)。

注意float(后缀F/f)和double(后缀D/d)也会出现类似的问题。

旁注:您会意识到没有 byteshort 文字,您仍然可以将值(通常是 int 文字)分配给 byteshort变量:由于§ 5.2 about conversions in an Assignment Contexts 中的特殊规则,这是可能的:它们允许将较大类型的常量表达式分配给byteshortcharint if在类型范围内。

【讨论】:

  • 你从哪里花时间;-)
  • @Lukas:我偶尔会写这样的答案,希望我不必为它写 300 个较短的答案;-) 另外:帮助解释错误消息(希望)意味着更少的“什么该错误消息是否意味着“问题。
  • 你的答案非常好......毫无疑问,这就是为什么要投票,但请编辑它并在顶部(你的答案开始),只需在 1 行中写下问题的确切解决方案,然后在您的解释下方。因为很多人寻求快速的解决方案而不是深入的解释
  • 他们可以随意查看其他第二个答案(投票最高的答案甚至给出了快速解决方案)。我认为从长远来看,教育人们如何解析和理解错误消息比仅仅为他们做这件事更有用。 “给男人一条鱼……”等等。
  • 感谢旁注。
【解决方案3】:

试试9223372036854775807L。最后的L 告诉Java 9223372036854775807long

【讨论】:

    【解决方案4】:

    我过去遇到过这个问题,我通过以科学形式编写值来解决这个问题。 例如:

    double val = 9e300;
    

    【讨论】:

      【解决方案5】:
      long ak = 34778754226788444L/l;
      

      两者都使用,但一次只使用一个大写 L 或小写 l。

      为什么使用 L/L?因为 long 是整数数据类型的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2017-03-21
        • 2018-08-25
        • 2016-04-30
        • 1970-01-01
        相关资源
        最近更新 更多