Я сделал небольшую программу для определения длины предоставленного пользователем целого числа:
#include <iostream>
using namespace std;
int main()
{
int c=0; //counter for loop
int q=1; //quotient of number upon division
cout << "Hello Cerberus! Please enter a number." << endl;
cin >> q;
if(q > -10 && q < 10)
{
cout << "The number you entered is 1 digit long." << endl;
}
else
{
while(q != 0)
{
q=q/10;
c++;
}
cout << "The number you entered is " << c << " digits long." << endl;
}
return 0;
}
Это работает довольно хорошо, если числа не становятся слишком большими. Как только длина ввода составляет 13 цифр или около того, программа по умолчанию принимает значение «Введенное вами число имеет длину 1 цифра» (оно даже не должно представлять это решение, если число не находится в диапазоне от -10 до 10).
Есть ли ограничение длины для целых чисел, вводимых пользователем, или это демонстративно ограничивает объем памяти моего компьютера?
Это предел в архитектуре вашего компьютера. Каждый числовой тип имеет фиксированный верхний предел, потому что тип описывает данные с фиксированным размером. Например, ваш int
может занимать четыре или восемь байтов в памяти (в зависимости от процессора; исходя из ваших наблюдений, я бы сказал, первого), и существует очень много комбинаций битов, которые могут храниться в таком количестве байтов памяти.
Вы можете определить диапазон int
на вашей платформе с помощью std::numeric_limits
, но лично я рекомендую придерживаться псевдонимов с фиксированной шириной (например, int32_t
, int64_t
) и выбрать тот, который имеет достаточный диапазон для вашего применения.
В качестве альтернативы существуют так называемые библиотеки «bigint», которые по сути являются классами, оборачивающими целочисленные массивы и добавляющими умные функциональные возможности, чтобы заставить произвольно большие значения работать так, как если бы они были арифметическими типами. Это, вероятно, излишне для вас здесь.
Просто не поддавайтесь искушению начать использовать типы с плавающей точкой (float
, double
) за их магические способности, увеличивающие диапазон; точно так же, как и с целочисленными типами, их точность принципиально ограничена, но использование типов с плавающей точкой добавляет дополнительные проблемы и проблемы на вершине.
Тем не менее, нет никаких фундаментальных ограничений для пользовательского ввода. Это потому, что ваш поток конвертирует текстовые символы, и ваш поток может содержать столько текстовых символов, сколько вы можете себе представить. На этом уровне вы действительно ограничены только доступной памятью.
Других решений пока нет …