Шаг 394 - Что дальше делать с переполнением

А дальше нужно делать класс. Вот такой например. Основная работа по перегрузке всяких там операторов. Мы перегрузим сложение.

// 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;	
}

Сейчас все нормально.

394_1.gif (2407 b)

Прибавим число побольше.

i=ci+4;

Вот, что и требовалось.

394_2.gif (7385 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 07.07.2002