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?
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).
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).