Целочисленное переполнение
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Всем привет!
Учусь программировать на C++, после прохождения всех уроков с этого сайта, решил прочитать книгу Гилберта Шилдта. В одной из программ, при вводе значения переменной
short int guess
с клавиатуры размером больше данного типа данных, т.е. например 50000, циклfor (attempts = 0; attempts < 100; attempts++)
в функцииvoid play(int m)
начинает повторяться уже не требуя ввод клавиатуры, как бы зависает в цикле. Не помогло и переопределение переменной внутри вначале цикла, а так же проверки на переполнение, подскажите как можно решить данную проблему. Программа не серьезная, но на будущее хотелось бы быть готовым к таким проблемам. Пользуюсь Visual Studio 2015. При вводе значений нормальной размерности, все работает как часы. Решения типа поменять тип переменной наdouble
не предлагать, т.к. по сути можно ввести число размера 10000000000000000000000000000000, и программу так же заглючит.Скрин глюка:
А как Вы узнаете, что число больше максимума? Максимум для данного типа на то и максимум, что число не может быть больше :)
Хреновое решение:
Да... запутанная история.
Спасибо. Понял свою ошибку по поводу проверки:)
А почему хреновое решение?
А для чего в строке
(std::cout << "Input error. Please, try again\nGuess the magic number: ").flush() ;
в концеflush()
и без него вроде работает нормально?std::cin.clear() ;
— это как я понял основной момент, который отчистит поток ввода и уберет рекурсию, верно?std::cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ) ;
— можете объяснить что делает эта строка? В общих чертах понял, что что-то обрезает, и как показал опыт, решает проблему ввода символов вместо цифр.Так лучше?
Целесообразнее, конечно, сделать в виде функции. Поскольку в этой программе засада с переполнением имеется не только с
short guess
, но и сint option
вmain()
.Также
fail()
(точнее говоря, поток) будет реагировать и на попытку нецифрового ввода, когда ожидается число. Так что"Overflow"
тут весьма относительное ))strel, RTFM! Хотя бы тот, который идёт в поставке Visual Studio. Или здесь.
Не верно. Совсем не верно. RTFM — без этого — никак (