Pages: [1]   Go Down
Author Topic: Problemas con un numero mayor a 65535  (Read 1859 times)
0 Members and 1 Guest are viewing this topic.
Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, estrenándome en le nuevo foro tengo un problema muy básico y curioso con este codigo no consigo sacar el resultado por pantalla de una multiplicacion, he probado con long, float, unsigned long   q teoricamente el rango da pero nada me sale 6264 por la consola

unsigned long salto=359*200; //deberia dar 71800
Serial.println(salto);

Alguna idea?? porque yo no lo entiendo. Donde va 359 iria una variable q iria entre 1 y 359.
UN saludo

« Last Edit: April 29, 2012, 05:54:41 pm by coleoptero » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino toma por defecto los números como int, por lo que si pones 359*200, estás multiplicando dos int y el resultado será un int, por lo que deberás decir que al menos uno de ellos es un long, para que así se realice la operación como longs.

Code:
void setup(){
  Serial.begin(9600);
  unsigned long salto=long(359)*long(200); //deberia dar 71800
  Serial.println(salto);
}
void loop(){}
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias chiva, asi si que funciona, aunque no me acaba de quedar claro porque se ha de poner long a los que se multiplican, sino te importa me gustaria saberlo para que no me vuelva a pasar.
Un saludo.
Logged

0
Offline Offline
Jr. Member
**
Karma: 5
Posts: 72
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino internamente está programado en C++.
Los tipos de datos ocupan un tamaño de bits determinados.
Un entero ocupa 16 bits, un long 32 bits.
Con 16 bits hay 2^16 distintas combinaciones. De -32768 a +32765 si se usa signo o de 0 a 65535 si no se utiliza.
Con 32 bits se puede llegar hasta 2^32. De 0 a 4294967295.

Cuando un programa hace a = b * c el compilador que acaba pasándolo a código máquina lo hace por partes.
Primero hace la multiplicación (b*c) en una variable intermedia y luego mueve esa variable intermedia a lo que ponga antes del igual (a).

Cuando multiplica b * c mira el tipo de las dos variables y según sea este calcula el tipo del resultado.

int * int --> int
int * long --> long
long * long --> long

Tu estabas en el primer caso, por lo que la multiplicación acababa en una variable temporal de tipo int (16 bits).

El compilador en ningún momento mira cual es el tipo de la variable final.

Si luego tiene que hacer
a (que es de tipo long)  = variabletemporal(que es de tipo int)
convierte la variable temporal a long, pero la información se ha perdido antes.

Se soluciona como te han dicho haciendo la conversión a long -->  salto=359*long(200); o directamente poniéndole una letra ele (l) al numero por detrás. salto=359*200l;.

Esto último es mas eficiente (deja mas espacio libre en el Arduino), pero como ves no se ve si pone doscientos+ele o dosmiluno.

A mi siempre me ha gustado para cosas de programación usar un tipo de letras que deje bien claro la diferencia entre el cero (0) y la letra o mayúscula (O) y también entre el uno (1) y la letra ele (l).


Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

xlopez, muchas gracias creo que mas claro no se puede dejar, jeje, esta bien saberlo, me estaba volviendo loco por algo tan sencillo.
Cada día se aprende algo.
Muchas gracias a todos, así da gusto.
Logged

Maracaibo
Offline Offline
Jr. Member
**
Karma: 1
Posts: 81
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos.
Otra forma seria
unsigned long salto=359.0*200.0; //deberia dar 71800
Serial.println(salto);
El ".0" luego del valor indica que es un long.
Logged

Pages: [1]   Go Up
Jump to: