Enteros >9999 en PIC C18

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 1 norte 9999 . 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?

Verifique esta respuesta: stackoverflow.com/questions/6302195/… Realmente desea limitar sus divisiones al mínimo, ya que son lentaswwwwwwwwwwww
Usted ha hecho counter<1,000,0000en el principal. Sin embargo, el contador es unint
@abdullahkahraman sí, gracias. Pensé que inttendría 32 bits, como en Java, por ejemplo.
Aquí está mi rutina que está optimizada para un microcontrolador de 8 bits. Es rápido ya que no utiliza ningún módulo ni multiplicación. Además, puede modificarlo fácilmente para que sea adecuado para más dígitos.

Respuestas (1)

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;
¿Cómo? Cuando inputes 10,000, se establecerá starten 10,000.
¡Ah! Pensé que un int tendría 32 bits, ¡pero eso es un long! Para referencia, la sección 2.1 .
@abdullahkahraman no, lo establece en 100 000 y el contador se establece en inicio/10.
Cuando la entrada es 10.000, se establecerá starten 10.000. Sin embargo, cuando la entrada es mayor que 10 000, se establecerá starten 100 000. ¿Qué estoy haciendo mal?
@abdullahkahraman Es <=, no <;)
@CamilStaps, puede ser una trampa con algunos microcompiladores, también agregué la forma en que normalmente lo haría que es más portátil.
@CamilStaps Pero 10 000 = 10 000 cuando input=10,000.
@abdullahkahraman siempre que start<=10,000se 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.