Boa tarde galera,
Estou encontrando um problema muito estranho com multiplicação no Arduino.
Vejam a rotina abaixo. Será que alguém já viu algo parecido?
void setup() {
Serial.begin(115200);
unsigned long Id_Digital = 0;
Id_Digital = 1*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 10000
Id_Digital = 2*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 20000
Id_Digital = 3*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 30000
Id_Digital = 4*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 4294941760
Id_Digital = 5*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 4294951760
Id_Digital = 6*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 4294951760
Id_Digital = 7*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 4464
Id_Digital = 8*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 14464
Id_Digital = 9*10000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 24464
Id_Digital = 1*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 100000
Id_Digital = 2*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 200000
Id_Digital = 3*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 300000
Id_Digital = 4*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 400000
Id_Digital = 5*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 500000
Id_Digital = 6*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 600000
Id_Digital = 7*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 700000
Id_Digital = 8*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 800000
Id_Digital = 9*100000;
Serial.println(Id_Digital); // resultado na tela: Id_Digital = 900000
}
void loop() {
}
.
Tags:
O problema sempre esta no ponto fluante... programação em nivel de máquina. fazer a multiplicação com assembly!
se nao me engano, vc tem q colocar um L no final: 10000L para confirmar como long...
Faz um cast pra ver.
Id_Digital =(unsigned long) 4*10000;
Valeu pessoal,
Postei também minha duvida no site arduino.cc:
http://forum.arduino.cc/index.php?topic=206796.new;topicseen#new
Conforme explicação do "robtillaart" devemos declarar o tamanho das constantes para garantir que o compilador não se confunda na hora de devolver o tamanho bytes. Se as duas constantes da operação são int "16bits" o compilador reservará para retorno uma variável de 16 bits, portanto qualquer operação que estoure 16 bits o resultado não será o esperado. Para evitar isso devemos informar na constante o tamanho esperado de retorno.
Id_Digital =(unsigned long) 4*10000;
ou
Id_Digital = 4*10000UL;
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por