Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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, и не микроконтроллеры какие-нибудь вшивые...
Интересно, а кому они нужны, и ЧТО они пишут: драйверы, протоколы, КоДеки ?
( Где бы на них... посмотреть (серъёзно) ?
Очень интересно, хотя это, наверно, ЖЕСТЬ ???) |
|
Вернуться к началу |
|
|
|