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

Проверка арифметического переполнения для int - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Оператор return; http://www.cyberforum.ru/cpp-beginners/thread32210.html
В коде одного примера встретился оператор return; Который просто ничего не возвращает. Вот часть кода: void PartList::Iterate(void (Part::*pFunc)()const)const { if (!pHead) { return; }...
C++ Как увидеть результат выполнения программы в Dev-C++ 4.9.9.2 ? И ещё, когда запускаю exe-файл, вместо нормального текста какая-то абракадабра на русском языке. Можно это исправить? Только начал изучать программирование, если можно, отвечайте общедоступным... http://www.cyberforum.ru/cpp-beginners/thread32172.html
Переменная в register, операция >>, во что компилится? C++
Если объявлена переменная register unsigned int i=100; и затем мне надо выполнять операцию >>1 (деление на 2), в цикле, дак вот, если написать просто i=i>>1; эта строка скомпилится именно в...
C++ Ограничения для структуры if
у меня прога некорректно работает. есть подозрения на структуру if - в ней должно выполнятся 5 условий if ((f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)&&(f_card==1)) существуют ли...
C++ Подправить сортировку в проге http://www.cyberforum.ru/cpp-beginners/thread32139.html
Мне необходимо переделать сортировку по возрастанию количества цифр в строке в сортировку по убыванию (это конкретная часть из программы). int Sort::fcel (char*a) { int b=0; for (int...
C++ Как можно посчитать ширину дерева? Товарищи!!!!! подскажите пожалуйста как можно посчитать ширину дерева!!!????? (под шириной дерева понимается максимальное количество елементов, находящихся на одном уровне) очень надо!!! подробнее

Показать сообщение отдельно
rrrFer
Заблокирован
30.04.2009, 17:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//ex8_4.cpp
//работа перегружаемых арифметических операций с типом Int
#include <iostream>
using namespace std;
#include <process.h>         //для exit()
///////////////////////////////////////////////////////////
class Int
    {
    private:
      int i;
    public:
      Int():i(0)             //конструктор без аргументов
        {}
      Int(int ii):i(ii)      //конструктор с одним
                             //аргументом
        {}                   //(из int в Int)
      void putInt()          //вывод Int
        {cout <<i;}
      void getInt()          //чтение Int с клавиатуры
        {cin >>i;}
      operator int()         //операция преобразования
        {return i;}          //(Int в int)
      Int operator +(Int i2) //сложение
        {return checkit(long double(i)+long double(i2));}
      Int operator -(Int i2) //вычитание
        {return checkit(long double(i)-long double(i2));}
      Int operator *(Int i2) //умножение
        {return checkit(long double(i)*long double(i2));}
      Int operator /(Int i2) //деление
        {return checkit(long double(i)/long double(i2));}
      Int checkit(long double answer) //проверка
                                      //результатов
        {
        if(answer >2147483647.0L ||answer <-2147483647.0L )
          {cout <<"\nOwu6ka nepenoJIHeHu9I\n ";system("pause");exit(1);}
        return Int(int(answer));
        }
    };
///////////////////////////////////////////////////////////
int main()
    {
    Int alpha =20;
    Int beta =7;
    Int delta,gamma;
    gamma =alpha +beta;     //27
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha -beta;      //13
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha *beta;      //140
    cout <<"\ngamma=";gamma.putInt();
    gamma =alpha /beta;      //2
    cout <<"\ngamma=";gamma.putInt();
    delta =2147483647;
    gamma =delta +alpha;    //ошибка переполнения
    delta =-2147483647;
    gamma =delta -alpha;     //ошибка переполнения
    cout <<endl;
    system("pause");
    return 0;
    }
вот так у меня работает нормально(добавил system("pause"); для задержки перед выходом и выходом в случае ошибки
а что тут растолковывать?
операторы +-/*, перед возвращением результата вызывают функциж проверки переполеннеия
C
1
2
3
4
5
6
7
8
 Int operator +(Int i2) //сложение
        {return checkit(long double(i)+long double(i2));}
      Int operator -(Int i2) //вычитание
        {return checkit(long double(i)-long double(i2));}
      Int operator *(Int i2) //умножение
        {return checkit(long double(i)*long double(i2));}
      Int operator /(Int i2) //деление
        {return checkit(long double(i)/long double(i2));}
а она принимает число в long double- ши ре чем int и в случае переполлнения программа выводит сообщение и завершаетсмя, если ошибки нет, то возвращает то число, которое ей передали:
C++
1
2
3
4
5
6
7
 Int checkit(long double answer) //проверка
                                      //результатов
        {
        if(answer >2147483647.0L ||answer <-2147483647.0L )
          {cout <<"\nОшибка переполнения\n ";exit(1);}
        return Int(int(answer));
        }
PS/ извиняюсь за орфографию - чуток не в настроении
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru