В этом ответе я создал функцию для преобразования целого числа в строку 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');
}
Это работает , для . Однако для 10 000 и выше я получаю странные строки на терминале:
10000 => 2943
10001 => 2943
10002 => 2944
10003 => 2944
10004 => 2944
10005 => 2945
...
Почему это? Как я могу это исправить?
Это связано с тем, что следующий раздел кода будет пытаться установить 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;
input
10,000, будет установлено start
значение 10,000.long
! Для справки, раздел 2.1 .start
на 10 000. Однако, когда ввод больше 10 000, он будет установлен start
на 100 000. Что я делаю не так?<=
не так <
;)input=10,000
.start<=10,000
, оно будет умножено на 10. В последний раз оно умножается на 10, когда start=10,000
, поэтому конечным результатом будет 100 000.
Джиппи
Абдулла Кахраман
counter<1,000,0000
в основном. Однако счетчик являетсяint
пользователь17592
int
будет содержать 32 бита, как, например, в Java.Абдулла Кахраман