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() {
}

.

Exibições: 1009

Responder esta

Respostas a este tópico

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;

   

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço