а. Эти правила называются числовыми правилами продвижения и указаны в Спецификация языка Java
б. Существует два общепринятых метода борьбы с переполнением.
Первый метод, пост-проверка, где вы выполняете операцию, скажете сложение, а затем проверяете, что результат больше, чем любой из операндов. Например:
int c = a + b;
if( c<a) { // assuming a>=0 and b>=0
// overflow happened
}
Второй метод - это предварительная проверка, в которой вы в основном стараетесь не допустить переполнения. Пример:
if( a > Integer.MAX_INTERGER - b ) {
// overflow happened
}