Целочисленное переполнение
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Всем привет!
Учусь программировать на 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 — без этого — никак (