括号中的整数给出编译错误

Jok*_*ker 21 java int compiler-errors

我正在初始化两个整数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 
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Tun*_*aki 50

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

当您2147483648在括号内包裹时,它将成为一个将被计算为的表达式int.但是,2147483648太大而不适合int(太大了).

问题不会发生,-2147483648因为它是一个有效的int值.

JLS的相关部分:

  • 添加括号会创建"括号内的表达式"(第15.8.5节)
  • 默认情况下2147483648,整数字面值被视为int默认值(第3.10.1节)

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

  • @ShowStopper以这种方式看待它:`-2147483648`是有效的,它是最小值.但是,编写` - (2147483648)`,需要首先将`2147483648`评估为`int`(因为括号),但这个数字太大了1. (10认同)
  • 可以把它想象成`int c = 2147483648;`后跟`int b = -c;`,这实际上包括括号在做什么. (10认同)
  • @ShowStopper括号不是整数的一部分.括号强制操作顺序首先评估括号内的正整数,然后评估外部的`-`.括号内的正整数比`int`的边界大1 (6认同)

Tho*_*aud 11

int值从.-21474836482147483647.所以-(2147483648)是OutOfRange因为括号内的值作为评价int.您可以放入括号中的最大值是

Integer.MAX_VALUE //Which is equals to 2147483647
Run Code Online (Sandbox Code Playgroud)


Tag*_*eev 7

编译错误很明显:您正在使用int超出范围的文字.如果你真的想这样做,你可以使用long文字:

int b = (int) -(2147483648L);
Run Code Online (Sandbox Code Playgroud)

double文字:

int b = (int) -(2147483648.0);
Run Code Online (Sandbox Code Playgroud)