С вещественными типами вроде как все нормально. Ставим обработку ошибок переполнения и все в норме. А вот с int не удается сделать обработку. Упорно VC не видит переполнения. Хотя, если посмотреть в отладчике, то флаг переполнения успешно выставляется.
Значит выход пока только один, использовать ассемблер. Во-первых, для проверки нам нужно узнать максимальный размер int. Смотрим limits.h
#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */
Так, создаем программу Win32 Console.
#include "stdafx.h" #include "iostream.h" void main() { int i=2147483647; // максимальное значение int g=1; // вторая часть сложения int k=0; // флаг переполнения }
Ну, а теперь код сложения пишем на ассемблере:
#include "stdafx.h" #include "iostream.h" void main() { int i=2147483647; // максимальное значение int g=1; // вторая часть сложения int k=0; // флаг переполнения _asm { pushf // сохраняем флаги push ecx // сохраняем регистр который будем использовать mov ecx,dword ptr [i] // из переменной в регистр add ecx,dword ptr [g] // складываем mov dword ptr [i],ecx // результат назад jo overflow // переход по переполнению jmp endover; // небыло переполнения overflow: // переполнение mov dword ptr [k],1 // установим флаг endover: pop ecx // восстановить регистр popf // восстановить флаги } if (k==1) cout << "Overflow " << endl; else cout << "OK" << endl; }
Вот сейчас должно быть переполнение, так как мы выходим за границу int.
А теперь попробуем уменьшить числа, чтобы убедиться, что переполнения нет.
int i=2147483646; // максимальное значение
А все остальное так же. Запускаем:
Вроде как сработало. А на другую границу ?
int i=-2147483647; // максимальное значение int g=-2; // вторая часть сложения
Запускайте, сработает.