Подтвердить что ты не робот

Целое число в круглых скобках, дающее ошибку компиляции

Я инициализирую два целых числа a и b.

Он компилируется отлично для 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 
    }
}

Почему это так?

4b9b3361

Ответ 1

Причина в том, что тип данных int имеет допустимые значения в диапазоне [-2147483648, 2147483647].

Когда вы завершаете 2147483648 внутри круглых скобок, оно становится выражением, которое будет оцениваться как int. Однако 2147483648 слишком велика, чтобы вставить int (слишком большой на один).

Проблема не возникает для -2147483648, потому что это допустимое значение int.

Соответствующие части JLS:

  • Добавление скобок создает "Parenthesized Expressions" (раздел 15.8.5)
  • целочисленный литерал, такой как 2147483648, по умолчанию считается int (раздел 3.10.1)

    Integer литерал имеет тип long, если он суффикс с буквой ASCII L или L (ell); в противном случае он имеет тип int (п. 4.2.1).

Ответ 2

значения int идут от -2147483648 до 2147483647. Итак, -(2147483648) - это OutOfRange, потому что значение внутри скобок оценивается как int. Максимальное значение, которое вы можете положить в скобки,

Integer.MAX_VALUE //Which is equals to 2147483647

Ответ 3

Ошибка компиляции довольно понятна: вы используете литерал int, который выходит за пределы допустимого диапазона. Если вы действительно хотите это сделать, вы можете использовать long literal:

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

Или double литерал:

int b = (int) -(2147483648.0);

Ответ 4

Максимальное значение int равно 2147483647, а значение min - -2147483648. Но когда вы вставляете 2147483648 в фигурные скобки, сначала считаете его +2147483648, и он недействителен для int rage.

Ответ 5

Хорошим способом визуализации этого является просмотр (int) -(2147483648) как:

(int) -1 * (2147483648)

Когда это оценивается компилятором, он говорит, что я должен сначала преобразовать число в круглой скобке в целое число, а затем умножить на отрицательное 1. Затем он продолжает выполнять проверку диапазона по количеству и обнаруживает, что это больше, чем то, что может поместиться в целое число (2147483648), что является ошибкой компиляции.

Ответ 6

int Тип данных - 32-bit signed two complement integer.

Минимальное значение - 2,147,483,648.(-2^31)

Максимальное значение 2,147,483,647(inclusive).(2^31 -1)