Шаг 393 - Переполнение типа int

С вещественными типами вроде как все нормально. Ставим обработку ошибок переполнения и все в норме. А вот с int не удается сделать обработку. Упорно VC не видит переполнения. Хотя, если посмотреть в отладчике, то флаг переполнения успешно выставляется.

393_1.gif (8570 b)

Значит выход пока только один, использовать ассемблер. Во-первых, для проверки нам нужно узнать максимальный размер 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.

393_2.gif (2269 b)

А теперь попробуем уменьшить числа, чтобы убедиться, что переполнения нет.

int i=2147483646;	// максимальное значение

А все остальное так же. Запускаем:

393_3.gif (2235 b)

Вроде как сработало. А на другую границу ?

int i=-2147483647;	// максимальное значение
int g=-2;		// вторая часть сложения

Запускайте, сработает.


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