Números em java

Pessoal,

vejam esse código:

class TesteNumeros { public void calc() { int a = (int)Math.pow(2, 31); int b = (int)Math.pow(2, 31); int r = a * 2; System.out.println(a); System.out.println(b); System.out.println(r); } }

Saída do código:
2147483647
2147483647
-2

Eu até entendi o porque não estourou… entendi pq nao deu um overflow.
(porque como o digito mais significativo é usado para o sinal, e os 15 ultimos digitos estavam com 1 e eu somei tudo, ao invés de estourar, o digito mais significativo ficou com 1 no sinal e o resultado ficou negativo.

minha pergunta é…

não é possível estourar nunca uma variável numérica no java?!?!?!?!
eu tentei de tudo…
tentei somar dois números mesmo estando no limite positivo quanto no limite negativo… e não consigo fazer isso estourar…

com certeza é uma questão matemática, mas alguém poderia ajudar o grande wolverine aqui a entender isso por favor?

obrigado!

Não é possível. Se der overflow, ele despreza o bit mais significativo e bola pra frente.

Diferentemente do C#, não há nenhum aviso (exceção) se por acaso você “estourar” a capacidade de um int ou long, por exemplo.

Esse comportamento é herdado do C.

Como isso (estourar o valor) é relativamente fácil de checar em Assembly, eu acredito (e algumas pessoas da Sun / Oracle também) que seria relativamente simples implementar isso no Java, mas iria mexer em MUITA coisa. (Iria mexer nos bytecodes e na geração de código, o que está completamente fora de questão na Sun/Oracle).

http://msdn.microsoft.com/en-us/library/ms228601(v=VS.80).aspx para um exemplo do uso de “checked/unchecked” em C#.

Legal pessoal…

li o link que vc informou e é bem interessante… mas tenho que comentar sobre o título da página rsrsr…

Seria bem interessante se esse tipo de recurso (checked e unchecked operators) estivessem disponíveis no Java7.
Muitas vezes tornar uma operação checked pode trazer mais segurança para o código (na minha opinião).

Bom, mas obrigado a todos pelo esclarecimento.