А дальше нужно делать класс. Вот такой например. Основная работа по перегрузке всяких там операторов. Мы перегрузим сложение.
// MathInt.h: interface for the CMathInt class. // /////////////////////////// #if !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_) #define AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CMathInt { public: CMathInt(int xx); virtual ~CMathInt(); int operator+(int y); private: int x; }; #endif // !defined(AFX_MATHINT_H__BFCF903D_DFBA_45D9_984C_BE9DD0413545__INCLUDED_)
Его реализация:
// MathInt.cpp: implementation of the CMathInt class. // //////////////////////////////////////// #include "stdafx.h" #include "MathInt.h" ///////////////////////////// // Construction/Destruction ///////////////////////////// CMathInt::CMathInt(int xx) { x=xx; } CMathInt::~CMathInt() { } int CMathInt::operator+(int y) { int k=0; // флаг переполнения int z=x; _asm { pushf // сохраняем флаги push ecx // сохраняем регистр который будем использовать mov ecx,dword ptr [z] // из переменной в регистр add ecx,dword ptr [y] // складываем mov dword ptr [z],ecx // результат назад jo overflow // переход по переполнению jmp endover; // небыло переполнения overflow: // переполнение mov dword ptr [k],1 // установим флаг endover: pop ecx // востановить регистр popf // востановить флаги } if (k==1) throw("Overflow "); x=z; return x; }
А теперь попробуем использовать.
#include "MathInt.h" void main() { CMathInt ci(2147483646); int i; i= ci+1; cout << i << endl; }
Сейчас все нормально.
Прибавим число побольше.
i=ci+4;
Вот, что и требовалось.