Целое число в круглых скобках, дающее ошибку компиляции
Я инициализирую два целых числа 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
}
}
Почему это так?
Ответы
Ответ 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)