Если вы не знаете, что может быть X, это может быть наихудший случай. Итак, какой наихудший случай:
int X = Integer.MAX_VALUE;
long aLong = X + 1;
Вывод: вы не хотите, чтобы Eclipse предупреждала вас обо всем.
Если вы хотите исправить целочисленное переполнение
long aLong = X * Y * Z; //you could write
long aLong = (long)X * Y * Z;
Вывод: это не устранит проблемы с длительным переполнением. Если вы хотите исправить их, вы должны написать код вроде:
BigInteger tmp = BigInteger.valueOf(X).multiply(BigInteger.valueOf(Y)).multiply(BigInteger.valueOf(Z));
if(BigInteger.valueOf(Long.MAX_VALUE).compareTo(tmp)>=0){
long aLong = tmp.longValue();
}else{
System.out.println("Overflow");
}
Но это только проверит, может ли полученное значение соответствовать длинному. Но вы спрашиваете, произошло ли во время расчета «переполнение». Это будет означать, что после каждого расчета вам нужно будет это проверить.
Если вы хотите написать инструмент для затмения, который анализирует весь исходный файл, чтобы найти это, то я вас не остановлю. Но было бы намного проще запомнить следующие значения:
/*11111111111111111111111111111111*/int Y = -1; //-1
/*11111111111111111111111111111111*/int QRY = (Y >> 1); //-1
/*11111111111111111111111111111110*/int QLY = (Y << 1); //-2
/*11111111111111111111111111111110*/int QLX = (X << 1); //-2
/*11000000000000000000000000000000*/int QRZ = (Z >> 1); //-1073741824
/*10000000000000000000000000000000*/int Z = Integer.MIN_VALUE; //-2147483648
/*01111111111111111111111111111111*/int X = Integer.MAX_VALUE; // 2147483647
/*00111111111111111111111111111111*/int QRX = (X >> 1); // 1073741823
/*00000000000000000000000000000000*/int QLZ = (Z << 1); // 0