Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
etsetere
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 6
#1

Проблемы с переполнением - C++

03.03.2013, 23:35. Просмотров 358. Ответов 2
Метки нет (Все метки)

Программа реализует ряд Фибоначчи с остановкой после переполнения unsigned long. Но она, почему-то, даже после выхода за диапазон продолжает вычисления. Подскажите, пожалуйста, в чем ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{
unsigned long int n=0,n1=0,n2=1,l=0;
while (l<47)
{
n=n1+n2;
if (n>ULONG_MAX)  {cout<<"Error";break;}
n1=n2;
n2=n;
cout << n<<endl;
l=l++;
}
cout << ULONG_MAX<<endl;
getchar();
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 23:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с переполнением (C++):

Ошибка, связанная с переполнением буфера - C++
В общем, данный код рабочий, собираю на VS2013, при компиляции выдает переполнение буфера. Другие люди пробовали собирать у себя, у них всё...

Редкая ошибка, связанная с переполнением стека - C++
Значит ситуация такая, вот весь код он полностью рабочий, но для перегрузки потокового ввода вылетает и пишет, что стек переполнен. Сколько...

Пытаюсь разбираться с переполнением буфера в куче - C++
Нашел такой код: #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; int main(int argc, char* argv) { char *c = (char...

Реализация бинарного древа с помощью рекурсии чревата переполнением стека? - C++
В реализации бинарного древа с помощью рекурсии (использования рекурсии в процессе написании функций бинарного древа) черевато...

Проблемы с C++ - C++
Вот в универе дали код проги и сказали розабраться и обьяснить что это как оно работает и с чем его едять. Помогите разобраться что это...

Проблемы с gets - C++
здравствуйте,помогите пожалуйста сразу хочу заметить,что препод нас заставляет писать все в microsoft visual studio 2005 пишу...

2
palva
2747 / 1848 / 266
Регистрация: 08.06.2007
Сообщений: 7,030
Записей в блоге: 4
03.03.2013, 23:51 #2
Цитата Сообщение от etsetere Посмотреть сообщение
n>ULONG_MAX
Число типа unsigned long не может превышать ULONG_MAX по определению ULONG_MAX.
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
04.03.2013, 09:09 #3
ага. В контексте данной задачи, ты можешь сравнивать новое число с предыдущим. Полагая, что если происходит переполнение, новое значение не будет больше предыдущего члена.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{
unsigned long int n=0,n1=0,n2=1,l=0;
while (l<47)
{
n=n1+n2;
if (n < n2)  {cout<<"\n\nError: the number value has became less then previous. The last value equaled to " << n;break;}
n1=n2;
n2=n;
cout << n<<endl;
l=l++;
}
cout << "\nULONG_MAX=" << ULONG_MAX<<endl;
getchar();
return 0;
}
Впрочем, мне не нравится предложенный мной вариант)

Добавлено через 13 минут
другой вариант - лучший. НЕ использовать unsigned в целях предоставления лишнего бита. Тогда в контексте этой задачи - можно каждое новое полученное число сравнивать с 0. Если произойдет переполнение сверху - знаковое число гарантированно сменит знак. Этот факт можно сделать условием выхода из цикла.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2013, 09:09
Привет! Вот еще темы с ответами:

Проблемы кода - C++
Добрый день! Вопрос предельно прост, перечислите, пожалуйста все проблемы данного кода class Foo { public: Foo(int j) {...

Проблемы с перегрузкой - C++
Доброго времени суток. Собственно у меня следущая проблема. Создаю класс динамических одномерных массивов: class massiv { public: ...

Проблемы с меню - C++
Добрый вечер форумчане! У меня такя проблема.Решил 2 задачи по функциям. Их нужно вложить в меню которое дал препод,оно ниже #include...

Проблемы с задачей - C++
Я учусь на С++, и вот как бы понять, как именно эту зачаду решать в С++ 1. Реализовать классы с рисунка. У класса Car создать метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru