Enteros 9999 en PIC C18

3

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');
}

Este funciona , para \ $ 1 \ le {} n \ le9999 \ $. 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
...

¿Por qué es eso? ¿Cómo puedo solucionarlo?

    
pregunta Keelan

1 respuesta

4

Se debe a que 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 signo 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 como la siguiente que funcionará en todos los compiladores:

#include <stdint.h>
uint32_t start = 1;
    
respondido por el PeterJ

Lea otras preguntas en las etiquetas