Что должна делать моя программа, когда она видит целочисленное переполнение, которое не влияет на запуск программы? - PullRequest
0 голосов
/ 06 февраля 2011

Существует небольшая программа, которая принимает данные от пользователей по запросу.Он принимает предопределенные входные данные от пользователей и выполняет их.

Он также отображает число с подсказкой, указывающей количество команд:

myprompt 1) usercommand1
...
myprompt 2) usercommand2
...
...
myprompt 3)

Я не ожидаю, что пользователь даст большечем 65535 команд одновременно, поэтому count сохраняется как unsigned short данные.

Проблема:

Я не уверен, как программа должна обрабатыватьслучай, когда пользователь фактически пересекает этот предел количества команд.Должен ли я позволить счетчику свернуться до 0 (и продолжать цикл) или остаться на уровне 65535?

Я хочу, чтобы программа все еще функционировала нормально , как при вводе пользовательских данных и обработкеих так же, как и раньше.Кроме того, значение count вообще не влияет на выполнение команды.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2011

Похоже, вы решаете проблему, которая может никогда не возникнуть.

Давайте предположим, что ваши пользователи довольно быстрые, и им требуется 10 секунд для ввода командной строки. Ролловер произойдет через 655350 секунд, то есть приблизительно семь с половиной дней .

Пусть счетчик перевернется. Если это все еще беспокоит вас, тогда возьмите высокий путь и сделайте его unsigned long. Тогда он будет перенесен только после 1361 лет (на 32-битных машинах).

2 голосов
/ 06 февраля 2011

Если вы зададите себе этот вопрос, значит, вам следует пойти легким путем: сделать счетчик unsigned int.

Способ обработки ограничения очень зависит от того, для чего используется этот счетчик. У меня такое ощущение, что это не используется для каких-то действительно интересных вещей, поэтому ваш вопрос вроде спорный. Какой бы выбор вы ни сделали, он все равно будет работать правильно.

С другой стороны, если этот счетчик используется как real , вы должны спросить пользователя этого счетчика, как правильно действовать: у обоих есть свои плюсы и минусы (либо счетчик возвращается во времени, либо останавливается) так что ваш пользователь рискует быть удивленным.

Вы забыли упомянуть другие альтернативы: прекратить свою программу. Или удалите ограничение и используйте некоторую форму больших целых чисел (например, GMP lib), но это звучит излишне.

Обратите внимание, что DNS решает обернуть серийный номер в 2 ^ 32. Это делает его пригодным для использования навсегда. Предполагается, что пользователи счетчика обнаружат переполнение. RFC 1982

1 голос
/ 06 февраля 2011

Если честно, то:

Я хочу, чтобы программа по-прежнему функционировала нормально, как при вводе пользовательских данных, и обрабатывала их так же, как раньше.Кроме того, значение count вообще не влияет на выполнение команды.

отвечает на ваш собственный вопрос, если это не имеет никакого эффекта, просто дайте ему снова начать с 0.

...