Целые числа >9999 в PIC C18

В этом ответе я создал функцию для преобразования целого числа в строку 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);
}

Я тестировал эту функцию с помощью цикла:

unsigned int counter;
for (counter = 0; counter< 1000000; counter++) {
    writeInteger(counter);
    serialWrite('\r');
    serialWrite('\n');
}

Это работает , для 1 н 9999 . Однако для 10 000 и выше я получаю странные строки на терминале:

10000 => 2943
10001 => 2943
10002 => 2944
10003 => 2944
10004 => 2944
10005 => 2945
...

Почему это? Как я могу это исправить?

Проверьте этот ответ: stackoverflow.com/questions/6302195/… Вы действительно хотите ограничить свои подразделения до минимума, так как они медленныеwwwwwwwwwwww
Вы сделали counter<1,000,0000в основном. Однако счетчик являетсяint
@abdullahkahraman да, спасибо - я думал, что он intбудет содержать 32 бита, как, например, в Java.
Вот моя процедура, оптимизированная для 8-битного микроконтроллера. Это быстро, так как не использует модуль или умножение. Кроме того, вы можете легко изменить его, чтобы он подходил для большего количества цифр.

Ответы (1)

Это связано с тем, что следующий раздел кода будет пытаться установить start равным 100 000 для чисел, равных или превышающих 10 000, что слишком велико для беззнакового целого числа, которое является 16-битным и может содержать только 0-65535:

while (start <= input)
    start *= 10;

Изменение определения на следующее должно исправить это:

unsigned long start = 1;

Другой альтернативой сделать код более понятным является включение stdint.h, чтобы его можно было определить следующим образом, который будет работать во всех компиляторах:

#include <stdint.h>
uint32_t start = 1;
Почему? Когда input10,000, будет установлено startзначение 10,000.
Ах! Я думал, что int будет содержать 32 бита, но это long! Для справки, раздел 2.1 .
@abdullahkahraman нет, он устанавливает его на 100 000, а счетчик настроен на start/10.
Когда введено значение 10 000, оно будет установлено startна 10 000. Однако, когда ввод больше 10 000, он будет установлен startна 100 000. Что я делаю не так?
@abdullahkahraman Это <=не так <;)
@CamilStaps, может быть ловушкой с некоторыми микрокомпиляторами, я также добавил более переносимый способ, которым я обычно это делаю.
@CamilStaps Но 10 000 = 10 000, когда input=10,000.
@abdullahkahraman до тех пор , пока start<=10,000, оно будет умножено на 10. В последний раз оно умножается на 10, когда start=10,000, поэтому конечным результатом будет 100 000.