Проверка потерю значимости/переполнение в C++?

Существует ли общий способ проверить на переполнение или потерю значимости типа определенных данных (uint32, интервал и т.д.)?

Я делаю что-то вроде этого:

uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
   a -= (c - b)
}

Когда я печатаю после некоторых повторений, это отображает большое количество как: 4294963846.

10
задан Legend 8 March 2010 в 04:27
поделиться

2 ответа

Для проверки переполнения/недополнения в арифметике проверьте результат по сравнению с исходными значениями.

uint32 a,b;
//assign values
uint32 result = a + b;
if (result < a) {
    //Overflow
}

Для вашего случая проверка будет выглядеть так:

if (a > (c-b)) {
    //Underflow
}
10
ответ дан 3 December 2019 в 21:21
поделиться

Думаю, если бы я хотел это сделать, я бы создал класс, имитирующий тип данных, и сделал бы это вручную (что было бы медленно, я думаю)

class MyInt
{
     int val;
     MyInt(const int&nval){ val = nval;} // cast from int
     operator int(){return val;} // cast to int

    // then just overload ALL the operators... putting your check in
};

//typedef int sint32;
typedef MyInt sint32;

Это может быть сложнее, чем это, возможно, вам придется использовать define вместо typedef...

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

.
4
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: