Oi galera! Sou novo na área estou no segundo semestre de Ciências da Computação. Estou usando Netbeans para programar em java e um dos meus códigos se comportou de maneira estranha. Olhem só o código e o resultado.
package questao7;
//@author schinwinkwinsky
public class Main {
public static void main(String[] args) {
int x;
int soma=0;
int mult=1;
for (x=1; x<=30; x+=2){
System.out.println(x);
soma+=x;
}
System.out.println("A soma dos números acima é "+soma);
for (x=2; x<=30; x+=2){
System.out.println(x);
mult*=x;
}
System.out.println("O produto dos números acima é "+mult);
}
}
RESULTA EM:
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
A soma dos números acima é 225
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
O produto dos números acima é -1409286144
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
ALGUÉM SABE ME EXPLICAR PQ O PRODUTO FICOU NEGATIVO?
Oi, tudo bem?
O problema é que o valor do produto ultrapassa o valor máximo que cabe em um “int”, por isso apareceu esse
resultado estranho(não sei como funciona ao certo quando isso ocorre), mas troque o tipo da variavel “mult” de “int”
para “long” e o programa funcionará.
Obs.
O tipo int armazena 32-bits (de -2,147,483,648 até 2,147,483,647 (inclusive).
O tipo long armazena 64-bits (de -9,223,372,036,854,775,808 até 9,223,372,036,854,775,807 (inclusive).
Informações tiradas do java tutorial (http://java.sun.com/docs/books/tutorial/)
Isso acontece devido ao complemento de dois do número. Isso acontece porque o primeiro bit do número (o mais significativo) é o que determina o sinal do número. Quando você tenta fazer operações com números que não cabem na variável, acaba “estourando” o tamanho do número e vazando pra esse bit. Portanto, ele acaba ficando negativo.
Como alguém mencionou, coloque long ao invés de int (ou, ainda, BigDecimal, que é melhor ainda) que funciona.
Muito obrigado a todos pelas respostas! E ao moderador, desculpa pelo tópico duplo. Eu percebi que aconteceu e tentei excluir o tópico, mas não consegui. E desculpa pelo título com letras maiúsculas e as tags . Vou tentar não esquecer! Vlw!