Числовое присвоение должно выдавать ошибку - PullRequest
3 голосов
/ 18 января 2011

Я проводил некоторые тесты с числовыми преобразованиями и приведениями в Java, и обнаружил это странное поведение (для меня)

class Test {
public static void main(String[] args) {
    //int y = 100000000000000; //does not compile
    int x = 100000 * 1000000000; //compile (why?)
    System.out.println(x); //x is 276447232
   }
}

В основном x и y должны быть одинаковыми: почему он компилируется?

Ответы [ 2 ]

7 голосов
/ 18 января 2011

Целочисленное переполнение не обнаруживается в Java, поэтому умножение работает нормально.Однако литерал, который вы указали, был слишком большим и, следовательно, является ошибкой компилятора.

Я полагаю, что подавляющее большинство компиляторов Java будет предварительно вычислять это значение во время компиляции, которое не требуется JLS.Таким образом, это не может быть ошибкой, так как тогда разные компиляторы могут скомпилировать кусок кода или привести к ошибкам - что не так приятно.

Компилятор Sun Java фактически выполняет вычисления, как показывает разборка:

Compiled from "x.java"
class x extends java.lang.Object{
x();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   ldc     #2; //int 276447232
   2:   istore_1
   3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   6:   iload_1
   7:   invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
   10:  return

Здесь важно отметить, что для всех намерений и целей результат должен быть таким же, как если бы он был вычислен во время выполнения.Поэтому здесь не может возникнуть ошибка компилятора.

0 голосов
/ 18 января 2011

Java имеет дело с переполнением целого числа не исключением, а переключением на отрицательные значения и продолжением вверх.

В качестве примера приведен фрагмент кода:

int x = Integer.MAX_VALUE + 1;
System.out.println(x);

Javaсправляется с этим как можно лучше.Этот фрагмент выводит:

-2147483648

Что является значением Integer.MIN_VALUE.Вы просто должны быть осторожны, когда имеете дело с действительно большими числами.Вот почему в Java есть класс BigInteger для работы со сколь угодно большими числами, выходящими за пределы целых чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...