Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Как в Си определить выход за приделы кода (переполнение) результата операции ?

Непрочитано 25.04.2013, 21:42  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от alvadep Посмотреть сообщение
Где примеры доказывающие обратное.
Обратное к чему? Очевидно же, что оно не удовлетворяется из sumADC›~temp16 ---› ~sumADC‹temp16, что приводит к неравенству sumADC+temp16›~sumADC+~temp16, т.е. что для произвольного X›~X???
И почему тогда в книге Генри Уоррена "Алгоритмические трюки для программистов" указано условие для проверки переполнения как:
Код:
if(sumADC|temp16)›(temp16+sumADC) // условие проверки переполнения
,
Реклама:
electroTrash вне форума  
Непрочитано 25.04.2013, 22:06  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

А что условие проверки переполнения из книги "Алгоритмические трюки для программистов" является единственно правильным решением и другие варианты не имеют право на существование? Почитайте пояснения к другим вариантам тут и тут и попробуйте аргументировано доказать (желательно на пальцах т.е. на числах) не правомерность таких решений.
alvadep вне форума  
Непрочитано 25.04.2013, 22:25  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от alvadep Посмотреть сообщение
попробуйте аргументировано доказать
Я уже привел свое доказательство, если не согласны, то попробуйте доказать, где допущена ошибка в моих выкладках и объяснить причину относительно сложного выражения в вышеприведенной книге (кстати, весьма интересной)?
electroTrash вне форума  
Непрочитано 25.04.2013, 22:38  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от electroTrash Посмотреть сообщение
Обратное к чему? Очевидно же, что оно не удовлетворяется из sumADC›~temp16 ---› ~sumADC‹temp16, что приводит к неравенству sumADC+temp16›~sumADC+~temp16, т.е. что для произвольного X›~X???
Просто ~sumADC+~temp16 не равно ~(sumADC+temp16), как Вы утверждаете.
Ara41 вне форума  
Непрочитано 25.04.2013, 23:37  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Вставлю и я свои 5 копеек.
Из sumADC›~temp16 или ~sumADC‹temp16 совершенно не значит, что sumADC+temp16›~sumADC+~temp16

Пример (для наглядности возьму 1 байт).
sumADC = 00000010
temp16 = 11111110
С этим согласны : 00000010 › ~11111110 или ~00000010 ‹ 11111110
А с этим : 00000010 + 11111110 › 11111101 + 00000001
Вот, что получается после сложения: 00000000 › 11111110
alvadep вне форума  
Непрочитано 26.04.2013, 00:00  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от Ara41 Посмотреть сообщение
~sumADC+~temp16 не равно ~(sumADC+temp16)
Да, но только при переполнении! Для остальных случаев все верно.
Это неплохой пример математической софистики!
electroTrash вне форума  
Непрочитано 26.04.2013, 00:09  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Ну а как быть с вторым вопросом:
Сообщение от electroTrash Посмотреть сообщение
объяснить причину относительно сложного выражения в вышеприведенной книге (кстати, весьма интересной)?
PS. Честно говоря, я ответа не знаю, думаю, что должно быть какое то логическое объяснение.
electroTrash вне форума  
Непрочитано 26.04.2013, 00:28  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Выражение
Цитата:
~sumADC+~temp16 не равно ~(sumADC+temp16)
однозначно в любом случае.

А в книге Уоррена наблюдается некая избыточность, ну кто не без греха.
alvadep вне форума  
Непрочитано 26.04.2013, 00:32  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от electroTrash Посмотреть сообщение
Да, но только при переполнении! Для остальных случаев все верно.
Это неплохой пример математической софистики!
не верно для всех случаев.
Представим инверсию числа Х как (-1-Х)
инверсию Y как (-1-Y)
л.ч. = -1-Х-1-Y=-2-Х-Y
п.ч. = -1-(X+Y) =-1-X-Y
Две части Вашего "равенства" будут отличаться на единицу.
Ara41 вне форума  
Непрочитано 26.04.2013, 00:50  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Тэк-с. Не поленился и скачал упомянутую книгу Уоррена. И что мы видим?!? В разделе 2.12 "Обнаружение переполнения" на странице 42 русского перевода: для обнаружения переполнения при беззнаковом сложении х+у приведены две формулы проверки:
Код:
~x ‹ y
x+y ‹ x
Если выполняется любое из условий, то будет переполнение при сложении.
Налицо полное единодушие с Генри!
Формулу увж. электроТраша найти пока не удалось ...
Yurkin2007 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Измерение времени выполнения куска кода в Протеусе. Как? tems-ya Proteus 4 21.01.2010 21:41
ATmega128 PORTF как инициализировать на выход lzrvt Микроконтроллеры, АЦП, память и т.д 3 07.10.2007 17:07
Как уменьшить прошивку кода написанного на С? graham Микроконтроллеры, АЦП, память и т.д 30 14.01.2006 21:03
[Решено] Порт А неработает как выход LDA Коллекция глюков 2 06.12.2004 20:25
переполнение TMR2 ??? Picallka Микроконтроллеры, АЦП, память и т.д 2 11.02.2004 21:32


Часовой пояс GMT +4, время: 14:57.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.