![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 18.03.2009
Сообщений: 6
|
![]()
Доброго времени суток. Возник вопрос - как узнать было ли переполнение после последнего арифметического действия?
Заранее спасибо. |
![]() |
![]() |
![]() |
#2 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
![]()
Переполнения чего?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
![]() |
![]() |
![]() |
#3 |
Студент 1 курса
Форумчанин Подтвердите свой е-майл
Регистрация: 27.06.2008
Сообщений: 959
|
![]()
Если переполнение случается то в переменной обычно становится большое отрицательное число.
посмотри под отладкой
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
|
![]() |
![]() |
![]() |
#4 |
Регистрация: 18.03.2009
Сообщений: 6
|
![]()
Извините, за неполное объяснение - перечитал и понял что конкретики мало.
И так, по порядку - имеется два целых беззнаковых числа (например x и y). После операции сложения или умножения результат может не помещаться в разрядной сетке, т.е. происходит переполнение (можете называть его переносом за пределы разряной сетки). Некоторой третьей переменной z необходимо присвоить значение 0 если переполнения не было, и значение 1 если оно было. |
![]() |
![]() |
![]() |
#5 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
хм, у меня всегда программа при переполнении просто вырубается(((
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 18.03.2009
Сообщений: 89
|
![]()
Можно до выполнения операции, при которой может быть переполнение, проверить это другой операцией вычитания из максимального значения.
Типа: Код:
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 18.03.2009
Сообщений: 6
|
![]()
Pashan, к подобному я и сам пришел, но как мне кажется тут излишние операции. Процессор всегда вырабатывает признаки (переполнение, равность нулю и т.д.) - вот как к этим признакам (флагам если угодно) добраться?
Так как операция (сложение или умножение) все равно должна происходить, ведь этот результат будет использоваться дальше, я написал следующий код: Код:
Код:
|
![]() |
![]() |
![]() |
#8 | |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
![]() Цитата:
![]() Но это в теории, на самом деле все зависит от конкретной реализации (компилятора), где-то действительно так и происходит, где то программа может "повиснуть", где то вылезает ошибка. Стандартом это не оговорено. Для того, чтобы отловить выход за пределы диапазона значений нужно знать этот самый диапазон для нужного нам типа, и перед последующий арифметической операцией записывать значение в какую то другую переменную, которая имеет заведомо больший диапазон. Далее сравнивать полученное значение с границей нужной нам переменной, если оно его не превышает, можно выполнять операцию с ней. З.Ы. Это первое решение, которое пришло в голову. Мне оно, если честно, не очень нравится, но у меня после трудной игры в футбол мозг не соображает больше ![]() Во, решения выше, наверное более удачные. Не обратил сразу внимания
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 18.03.2009
Сообщений: 89
|
![]()
Dayne, я не знаю, что у тебя за задача, но очень похоже, что у тебя стандартная периодическая болезнь всех программистов оптимизации всего и вся (это когда хочется каждое "i++" еще куда-то оптимизировать, хотя никому это нафиг не надо).
![]() Даже если есть где-то такой бит, не думаю, что от него станет сильно лучше. И это при том, что не факт, что он есть на всех компьютерах и во всех компиляторах. А если этот бит достается через какую-нибудь функцию а-ля GetLastError(), то тем более. Когда кажется, что лишние две-три операции - это слишком много, то надо выключить компьютер, пойти выпить чашку кофе и расслабиться ![]() |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 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? |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка переполнения и 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 |