Существует ли общий способ проверить на переполнение или потерю значимости типа определенных данных (uint32, интервал и т.д.)?
Я делаю что-то вроде этого:
uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
a -= (c - b)
}
Когда я печатаю после некоторых повторений, это отображает большое количество как: 4294963846.
Для проверки переполнения/недополнения в арифметике проверьте результат по сравнению с исходными значениями.
uint32 a,b;
//assign values
uint32 result = a + b;
if (result < a) {
//Overflow
}
Для вашего случая проверка будет выглядеть так:
if (a > (c-b)) {
//Underflow
}
Думаю, если бы я хотел это сделать, я бы создал класс, имитирующий тип данных, и сделал бы это вручную (что было бы медленно, я думаю)
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...
Я делал подобное с указателями, чтобы проверить, где память записывается за пределы границ. очень медленно, но нашел, где память была повреждена
.