Если я правильно понимаю, мы хотим сделать: для каждого числа x
в диапазоне проверьте, равна ли какая-либо из его цифр digit
5.
Как мы это делаем ?
Одна вещь, которую мы могли бы сделать, - привести строку digit =>, а затем проверить, существует ли подстрока «5». Но это наивное решение, требующее больше памяти и времени для хранения всех цифр в строке (а не нескольких байтов, необходимых для представления существующего целого).
Таким образом, разумнее было бы постоянно извлекать наименее значащую цифру (digit = x % 10
), проверять if digit == 5
, а затем делить наименее значимую цифру для повторения (x //= 10 WHILE x > 0
).
Раньше у компьютеров было мало памяти. Это было главной причиной, почему у вас были разные типы данных. Если вам нужна переменная для хранения только небольших чисел, вы можете использовать 8-битный символ вместо 32-битного. Однако память сегодня дешева. Следовательно, эта причина менее применима в настоящее время, но все равно застряла.
Однако имейте в виду, что каждый процессор имеет тип данных по умолчанию в том смысле, что он работает на определенной ширине (обычно 32-битной). Таким образом, если вы используете 8-битный символ, значение должно быть расширено до 32-битного и обратно для вычисления. Это может немного замедлить ваш алгоритм.
В общем, существуют алгоритмы и конструкции, которые являются абстракциями, а типы данных помогают в реализации этих абстракций. Например, существует высокая вероятность того, что вес обычно представляется как рациональное число, которое лучше всего реализовать в хранилище в форме числа с плавающей запятой / двойного числа, т. Е. Числа, которое имеет прецизионную часть.
Надеюсь, это поможет.
char
- это наименьший адресуемый кусок памяти - хорошо подходит для работы с буферами данных, но не может содержать более 256 различных значений (если char
равно 8 биты, что обычно) и, следовательно, не очень хорошо для численных расчетов. int
обычно больше, чем char
- больше подходит для вычислений, но не так подходит для манипуляций на уровне байтов.
Remember that C
is sometimes used as a higher level assembly language - to interact with low level hardware. You need data types to match machine-level features, such as byte-wide I/O registers.
From Wikipedia, C (programming language):
C's primary use is for "system programming", including implementing operating systems and embedded system applications, due to a combination of desirable characteristics such as code portability and efficiency, ability to access specific hardware addresses, ability to "pun" types to match externally imposed data access requirements, and low runtime demand on system resources.
int
- это "натуральный" целочисленный тип, его следует использовать для большинства вычислений.
char
по сути является байтом; это самый маленький адресуемый блок памяти. char
имеет , а не 8-битную ширину на всех платформах, хотя в большинстве случаев это так.
Стандарт предписывает очень мало ограничений для char и int :
A char должен иметь возможность хранить Значение ASCII, то есть 7-битовое минимальное значение (EDIT: CHAR_BIT составляет не менее 8 в соответствии со стандартом C). Это также наименьший адресуемый блок памяти.
int имеет ширину не менее 16 бит и является «рекомендуемым» целочисленным типом по умолчанию. Эта рекомендация оставлена для реализации (ваш компилятор C).