【问题标题】:Integer in parentheses not compiling - Why?括号中的整数无法编译 - 为什么?
【发布时间】:2015-11-17 08:33:35
【问题描述】:

我正在初始化两个整数 ab

a 编译良好,但b 出现错误。

public class Main_1 {
    public static void main(String[] args) {
        int a = -2147483648; //Working fine
        int b = -(2147483648); //Compilation error: The literal 2147483648 of type int is out of range 
    }
}

请帮助我理解这种行为?

【问题讨论】:

  • 编译器错误提示了这一点,不是吗?
  • 不,这不是提示,而是错误...:)

标签: java compiler-errors int


【解决方案1】:

原因是int 数据类型在[-2147483648, 2147483647] 范围内具有有效值。

当您将2147483648 包裹在括号内时,它会变成一个表达式,将被评估为int。但是,2147483648 太大而无法放入int(太大了一个)。

-2147483648 不会出现此问题,因为它是有效的 int 值。

JLS 的相关部分:

  • 添加括号会创建一个“带括号的表达式”(section 15.8.5)
  • 一个整数文字,例如2147483648,默认被视为int (section 3.10.1)

    如果整数文字以 ASCII 字母 Ll (ell) 为后缀,则其类型为 long;否则它是int(§4.2.1)类型。

【讨论】:

  • 如果表达式变为 int 。那么为什么声明的 int 工作正常。
  • @ShowStopper 这样看:-2147483648 有效,是最小值。但是,编写-(2147483648),需要先将2147483648 评估为int(因为括号),但这比1 太大了。
  • 谢谢@Tunaki,所以我知道括号是整数的一部分,并且会增加整数范围
  • 把它想象成int c = 2147483648;,后面跟着int b = -c;,这实际上就是包含括号的作用。
  • @ShowStopper 括号不是整数的一部分。括号强制运算顺序首先计算括号内的正整数,然后计算外部的-。括号内的正整数比int的边界大1
【解决方案2】:

int 值从-21474836482147483647。所以-(2147483648) 是OutOfRange,因为括号内的值被评估为int。您可以放入括号中的最大值是

Integer.MAX_VALUE //Which is equals to 2147483647

【讨论】:

    【解决方案3】:

    编译错误非常清楚:您使用的 int 文字超出了范围。如果你真的想这样做,你可以使用longliteral:

    int b = (int) -(2147483648L);
    

    或者double字面量:

    int b = (int) -(2147483648.0);
    

    【讨论】:

      【解决方案4】:

      int 的最大值是2147483647,int 的最小值是-2147483648。但是,当您将2147483648 放入大括号时,它最初会被视为+2147483648,并且它对整数无效。

      【讨论】:

        【解决方案5】:

        (int) -(2147483648) 视为:

        (int) -1 * (2147483648)
        

        当编译器对此进行评估时,它说,我必须首先将括号中的数字转换为整数,然后将其乘以负 1。然后它继续对数字进行范围检查并发现它大于整数(2147483648)可以容纳的值,这是编译错误。

        【讨论】:

          【解决方案6】:

          int 数据类型是32-bit signed two's complement integer

          最小值为- 2,147,483,648.(-2^31)

          最大值为2,147,483,647(inclusive).(2^31 -1)

          【讨论】:

            猜你喜欢
            • 2013-08-18
            • 2016-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 2020-09-10
            • 2021-04-08
            相关资源
            最近更新 更多