Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2009, 18:45   #1
Dayne
 
Регистрация: 18.03.2009
Сообщений: 6
По умолчанию Признак переполнения

Доброго времени суток. Возник вопрос - как узнать было ли переполнение после последнего арифметического действия?
Заранее спасибо.
Dayne вне форума Ответить с цитированием
Старый 18.03.2009, 20:16   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Переполнения чего?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 18.03.2009, 20:57   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Если переполнение случается то в переменной обычно становится большое отрицательное число.
посмотри под отладкой
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 18.03.2009, 21:18   #4
Dayne
 
Регистрация: 18.03.2009
Сообщений: 6
По умолчанию

Извините, за неполное объяснение - перечитал и понял что конкретики мало.
И так, по порядку - имеется два целых беззнаковых числа (например x и y). После операции сложения или умножения результат может не помещаться в разрядной сетке, т.е. происходит переполнение (можете называть его переносом за пределы разряной сетки).
Некоторой третьей переменной z необходимо присвоить значение 0 если переполнения не было, и значение 1 если оно было.
Dayne вне форума Ответить с цитированием
Старый 18.03.2009, 22:05   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

хм, у меня всегда программа при переполнении просто вырубается(((
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 18.03.2009, 22:47   #6
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Можно до выполнения операции, при которой может быть переполнение, проверить это другой операцией вычитания из максимального значения.
Типа:
Код:
BYTE b1 = 150, b2 = 200;
...
if (b1 < 256 - b2)
{
  Z = 0;
  BYTE b3 = b1 + b2;
  ...
}
else
{
  Z = 1;
  ...
}
Pashan вне форума Ответить с цитированием
Старый 18.03.2009, 23:26   #7
Dayne
 
Регистрация: 18.03.2009
Сообщений: 6
По умолчанию

Pashan, к подобному я и сам пришел, но как мне кажется тут излишние операции. Процессор всегда вырабатывает признаки (переполнение, равность нулю и т.д.) - вот как к этим признакам (флагам если угодно) добраться?
Так как операция (сложение или умножение) все равно должна происходить, ведь этот результат будет использоваться дальше, я написал следующий код:
Код:
unsigned int number1,number2, result, overflow;
	number1=0xffffffff;
	number2=10;
	result=0;
	overflow=0;

	result=number1+number2;
	overflow=((result<number2)||(result<number1))?1:0;
Действует, может я псих, но все равно 2 сравнения результат с аргументами и оператор ветвления - мне кажется этого много. Думается должна быть переменная или бит в каком-то регистре, который превратит последнюю строку кода в
Код:
overflow= some_flag
Dayne вне форума Ответить с цитированием
Старый 18.03.2009, 23:26   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Dayne Посмотреть сообщение
Извините, за неполное объяснение - перечитал и понял что конкретики мало.
И так, по порядку - имеется два целых беззнаковых числа (например x и y). После операции сложения или умножения результат может не помещаться в разрядной сетке, т.е. происходит переполнение (можете называть его переносом за пределы разряной сетки).
Некоторой третьей переменной z необходимо присвоить значение 0 если переполнения не было, и значение 1 если оно было.
Обычно это называют выход за пределы диапазона значений. В теории все просто: допустим есть тип char придел его значений от -128 до 127 (на сколько я помню ). Возьмем переменную A типа char, присвоим ей значение 127. Если после этого мы попытаемся к ней прибавить единицу, то получим значение, равное нижней границе предела (-128), если прибавим 2, получим -127, и т.д.
Но это в теории, на самом деле все зависит от конкретной реализации (компилятора), где-то действительно так и происходит, где то программа может "повиснуть", где то вылезает ошибка. Стандартом это не оговорено.
Для того, чтобы отловить выход за пределы диапазона значений нужно знать этот самый диапазон для нужного нам типа, и перед последующий арифметической операцией записывать значение в какую то другую переменную, которая имеет заведомо больший диапазон. Далее сравнивать полученное значение с границей нужной нам переменной, если оно его не превышает, можно выполнять операцию с ней.
З.Ы. Это первое решение, которое пришло в голову. Мне оно, если честно, не очень нравится, но у меня после трудной игры в футбол мозг не соображает больше Если такое решение не подойдет, пишите, будем думать
Во, решения выше, наверное более удачные. Не обратил сразу внимания
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 18.03.2009, 23:44   #9
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Dayne, я не знаю, что у тебя за задача, но очень похоже, что у тебя стандартная периодическая болезнь всех программистов оптимизации всего и вся (это когда хочется каждое "i++" еще куда-то оптимизировать, хотя никому это нафиг не надо).
Даже если есть где-то такой бит, не думаю, что от него станет сильно лучше. И это при том, что не факт, что он есть на всех компьютерах и во всех компиляторах. А если этот бит достается через какую-нибудь функцию а-ля GetLastError(), то тем более.
Когда кажется, что лишние две-три операции - это слишком много, то надо выключить компьютер, пойти выпить чашку кофе и расслабиться
Pashan вне форума Ответить с цитированием
Старый 19.03.2009, 18:26   #10
Strogg
Пользователь
 
Аватар для Strogg
 
Регистрация: 19.03.2009
Сообщений: 13
По умолчанию

ERRNO.H
...
#define ERANGE 34
...
/*
Range error; used by mathematical functions when the result value is not representable because of overflow or underflow
*/

ERROR.H?
Strogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка переполнения и sqr. ray13 Паскаль, Turbo Pascal, PascalABC.NET 10 04.03.2009 15:59
Функция проверки переполнения в Delphi TimeChip Общие вопросы Delphi 14 31.01.2009 17:04
Ошибка переполнения стека Cannibal Общие вопросы Delphi 1 01.12.2008 21:32
ошибка "Переполнения" Tanuska___:) БД в Delphi 0 08.10.2008 12:58
Ошибка переполнения стека из-за использования рекурсий Morrigan13 Помощь студентам 5 02.04.2008 08:04