En esta respuesta , hice una función para convertir un número entero en una cadena ASCII:
void writeInteger(unsigned int input) {
unsigned int start = 1;
unsigned int counter;
while (start <= input)
start *= 10;
for (counter = start / 10; counter >= 1; counter /= 10)
serialWrite(((input / counter) % 10) + 0x30);
}
Probé esta función con un bucle:
unsigned int counter;
for (counter = 0; counter< 1000000; counter++) {
writeInteger(counter);
serialWrite('\r');
serialWrite('\n');
}
Esto funciona , por . Sin embargo, para 10,000 y más, obtengo cadenas extrañas en la terminal:
10000 => 2943
10001 => 2943
10002 => 2944
10003 => 2944
10004 => 2944
10005 => 2945
...
¿Porqué es eso? ¿Cómo puedo arreglarlo?
Es porque la siguiente sección de código intentará establecer el inicio en 100 000 para números iguales o superiores a 10 000, que es demasiado grande para un int sin firmar que es de 16 bits y solo puede contener 0-65535:
while (start <= input)
start *= 10;
Cambiar la definición a lo siguiente debería solucionarlo:
unsigned long start = 1;
Otra alternativa para aclarar el código es incluir stdint.h para que pueda definirse de la siguiente manera que funcionará en todos los compiladores:
#include <stdint.h>
uint32_t start = 1;
input
es 10,000, se establecerá start
en 10,000.long
! Para referencia, la sección 2.1 .start
en 10.000. Sin embargo, cuando la entrada es mayor que 10 000, se establecerá start
en 100 000. ¿Qué estoy haciendo mal?<=
, no <
;)input=10,000
.start<=10,000
se multiplique por 10. La última vez que se multiplique por 10 es cuando start=10,000
, por lo que el resultado final sería 100 000.
yippie
abdullah kahraman
counter<1,000,0000
en el principal. Sin embargo, el contador es unint
usuario17592
int
tendría 32 bits, como en Java, por ejemplo.abdullah kahraman