【问题标题】:Largest decimal literal of type int is 2147483648 or 2147483647?int 类型的最大十进制文字是 2147483648 还是 2147483647?
【发布时间】:2015-10-10 22:25:55
【问题描述】:

根据JLS §3.10.1

int 类型的最大十进制字面量是 2147483648。

因为Integer.MAX_VALUE2147483647,这句话可以被认为是真的吗?

请注意,上述声明中的重点是“int”。如果有人认为它是在“十进制文字”的上下文中讨论的,那么即使2147483649 等等,也应该是正确的。

所以,如果某个东西的类型是 int,那么它的最大值必须是 2147483647

是我弄错了还是该声明应该更新?

【问题讨论】:

  • 我不确定我是否理解您的问题,但您的引文后面的两段似乎阐明了这个问题。来自 JLS 中的同一部分:如果十进制文字 2147483648 出现在除一元减号运算符的操作数之外的任何位置,则会出现编译时错误;或者如果 int 类型的十进制文字大于 2147483648 (231)。
  • @alfasin 但是我怀疑这是否会使这个声明有效?我对这个陈述的问题,如果在这个陈述中甚至谈到了“一元减号运算符”,那么我可以理解。所以,它显然是模棱两可的。
  • 现在你要脱离上下文了……这部分应该作为一个整体来阅读,一个句子结束的事实并不意味着上下文也一样。阅读以下句子可以清楚地表明,虽然 2147483648 是最大的十进制文字 - 它仅在减号运算符之前才有效。
  • @alfasin 只是为了建立上下文,不能做出错误的陈述。
  • 这个说法没有错。 2147483648 与一元减号运算符一起使用时的有效 int。

标签: java


【解决方案1】:

请注意,没有负整数文字,Integer.MIN_VALUE 是 -2147483648。所以-2147483648 被解析为“将一元减号应用于 2147483648”。如果 2147483648 不是有效的十进制 int 文字,或者您不能在程序中直接使用值为 Integer.MIN_VALUEint 文字,那将是非常糟糕的。

旁注:JLS 定义什么是正确的。所以它的定义是正确的。不过,这可能很糟糕。

【讨论】:

  • 感谢您的意见。显然,该声明不是在谈论 -2147483648,我担心该声明的有效性。
  • “显然该声明不是在谈论 -2147483648” - 我认为你错了。请从您停止引用 JLS 的地方继续阅读
  • @alfasin 我已阅读并理解其意图,但我的问题是该声明的有效性。这是模棱两可的。
  • 你的回答是最有说服力的,而且正中靶心。谢谢。
【解决方案2】:

来自同一个JLS section

十进制文字 2147483648 只能作为一元减号运算符的操作数出现

int 值 = -2147483648;

存在

但是

int 值 = 2147483648;

是编译时错误。

【讨论】:

  • 感谢您的意见。显然,该声明不是在谈论 -2147483648,我担心该声明的有效性。
  • 该语句仅指绝对意义上的2147483648,但只能作为一元负值存在...:)
【解决方案3】:

每个文字都是特定类型的文字(布尔文字、整数文字、浮点文字等),尽管它可以分配给不同类型的字段/变量。例如,2147483647 是一个有效的整数文字,而2147999999 不是(而2147999999L ,尽管它是一个长文字)。虽然文字不清楚,但似乎没有任何矛盾。

【讨论】:

  • 感谢您的意见。但我担心那个陈述的有效性,那个陈述是不正确的。
【解决方案4】:

注意:Reimeus has the right answer 以上。


是的,你是对的,JLS 说

int 类型的最大十进制字面量是 2147483648 (2^31)

但是如果你尝试编译

    int j = 2147483648;

你得到

    Error:(20, 17) java: integer number too large: 2147483648

2^31 等于 2147483648,即 0x80000000,但在 32 位二进制补码表示法中,这实际上等于 -1。

所以,2^31 不能用 int 表示。

一个 int 只能表示从 Integer.MIN_VALUE(即 -2^31)到 Integer.MAX_VALUE(即 (2^31)-1)的值。幸运的是,编译器不接受超出该范围的整数文字。

【讨论】:

  • 感谢您的意见。是的,我担心该声明的有效性。
  • 但是根据 JLS,这应该可以工作:int j = 2147483648--;
  • @KevinKrumwiede 不,它没有。唯一有效的是int j = -2147483648;
  • @MikeNakis 啊,你是对的。我将“一元减号”读作一元减量而不是一元否定。
猜你喜欢
  • 2011-10-17
  • 2012-06-29
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2010-12-04
相关资源
最近更新 更多