Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

C++: с=a+b, переполнение.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Ср Мар 04 2009 08:21    Заголовок сообщения: C++: с=a+b, переполнение. Ответить с цитатой

Здравствуйте.
Вопрос, в-общем, не такой ламерский как может показаться:
Привести пример самого быстрого кода C++ (без перехода на asm), чтобы при выполнении c=a+b (все три - одного типа, напр. unsigned int) отловить ошибку переполнения.

(Нет, сам-то я знаю, можно например взять "удвоенный" тип вместо переменной c, затем сдвинуть (>>) на сколько надо бит, и посмотреть, 1 там или 0.
Но это... долго.
На asm... нельзя.
А как надо?).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Чт Мар 05 2009 13:22    Заголовок сообщения: почему начинающие стыдятся своих вопросов? Ответить с цитатой

да не извиняйся, брат. ламерский вопрос, что ни говори

ошибка переполнения ловится оптимально и элементарно. без всякого асма. нужно просто двоичное дополнение одного слагаемого и сравнить с другим слагаемым. если двоичное дополнение окажется больше, то всё в порядке, в противном случае будет переполнение. это звучит примерно так:
Код:
if ((~a)++ > b)
/* сюда попадаем, если переполнения теоретически не может быть */;
else
/* сюда попадаем, если переполнение обязательно будет */;
компилятор переведёт это безобразие в 5 асмовых инструкций:
    скопировать a в 1-й регистр
    инвертировать 1-й регистр
    инкрементировать 1-й регистр
    скопировать b во 2-й регистр
    сравнить 1-й и 2-й регистры
----------------------------------------------
ну почему начинающие преувеличивают значение своих вопросов? стыдятся своих вопросов что ли?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Пт Мар 06 2009 21:29    Заголовок сообщения: Ответить с цитатой

критикан, спасибо, конечно... Но извинятся мне всё же есть в чём.
Я поставил задачу не полностью. А надо было-то:
1. Сложить 2 числа (2 инта);
2. ЕСЛИ при этом было переполнение ТОГДА THROW;

Т.е. результат сложения тоже нужен сначала (переполнение возникает редко, на самом деле не возникает на реальных данных вообще, а надо это мне, чтобы "показывать"... ).
На асме (имхо):
1. скопировать 1 из чисел в РОН
2. add
3. условный переход по переполнению (пойдёт на throw)
4. резалт скопировать в память
вроде, и всё. Просто.
На Ся вот только... так уже не сделаешь, да? (Перехода, условного по переполнению, в языке С - просто нет. Или ошибаюсь?)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Мар 10 2009 14:07    Заголовок сообщения: программирую в асме -- остальное по... Ответить с цитатой

Yello писал(а):
надо было-то:
1. Сложить 2 числа (2 инта);
2. ЕСЛИ при этом было переполнение ТОГДА THROW

на такой случай подойдёт
Код:
c = a + b;
if ((~a)++ <= b)
THROW;
то есть идея в Си/С++ не в том, чтобы полностью заменить асм, а в том, чтобы, используя весьма гибкие средства Си/С++, переформулировать задачу так, чтобы она покрывалась сишным алгоритмом. в данном случае асмовский код, конечно, будет короче, но 5-6 лишних асмовских инструкций для современной программы -- это просто тьфу
-------------------------------------------------------------------
люблю программить в асме
и Си не признаю.
отращиваю космы
и всё мне по...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Пт Апр 03 2009 23:11    Заголовок сообщения: Ответить с цитатой

Спасибо, ясно.
/
Интересно, сейчас существуют ли такие люди, у которых asm-программы работают быстрее, чем нормально написанные и оптимально скомпиленные c C/C++ ?
Самое бОльшее, для 486 - может, и я бы так смог. Но вот под СОВРЕМЕННЫЕ x86 процы - это ж... жуть. Да?
(Они и не предназначены для "человеческой" оптимизации).
Или ошибаюсь ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Пн Апр 06 2009 14:23    Заголовок сообщения: в винде пишут проги для ком-порт, а юниксе - cat /dev/cuaa0 Ответить с цитатой

Yello писал(а):
Интересно, сейчас существуют ли такие люди, у которых asm-программы работают быстрее, чем нормально написанные и оптимально скомпиленные c C/C++?


конечно существуют (есть же любители-идеалисты. в смысле приверженцы абсолютного идеала). ведь компиляторы по большому счёту довольно глупы. даже после всех оптимизаций. правда непонятно, кому нужны 0,5% ускорения при 2000% увеличения работы
--------------------------------------------------------
какие красивые программы чтения с ком-порта пишут прогрессивные виндозники! а ретрограды-юниксоиды пишут "cat /dev/cuaa0"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Чт Апр 09 2009 22:02    Заголовок сообщения: Ответить с цитатой

Ну, не 0,5, а может где-то 5... (а то и 50%)

И значит, 1 чел работает под ВСЕ архитектуры (ведь только у Intel их несколько, новая стабильно появляется каждые 2 года) ???

ФИГАССЕ!
Это ж даже не RISC, и не микроконтроллеры какие-нибудь вшивые...

Интересно, а кому они нужны, и ЧТО они пишут: драйверы, протоколы, КоДеки ?

( Где бы на них... посмотреть (серъёзно) ?
Очень интересно, хотя это, наверно, ЖЕСТЬ ???)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...