#1 29.01.07 17:43
Арифметика в С++
Подскажите, пожалуйста, насколько корректен код:
Код: C++:
int char_ee::setaddr(int param) { char ctemp1, ctemp2; ..... return (ctemp1 << 8) | ctemp2; }
Или необходимо обходить
Код: C++:
int char_ee::setaddr(int param) { int itemp; char ctemp1, ctemp2; ..... itemp = ctemp1; itemp = (itemp << 8) | ctemp2; return itemp; }
Желательно в приложении к МК, а именно - IAR EWB
Исправлено asp (30.01.07 22:52)
Offline
#4 29.01.07 21:23
Re: Арифметика в С++
Смайлек, не фаХт... как раз-таки, ХОРОШИЙ - не соптимизирует :)
strike, опять же, не согласен. Времени выигрывается вагон, а проигрыш мизерный. Тот же IAR выдает asm'овский код практически в идеальном виде. Если что-то необходимо, можно уже там подправлять. ИМХО, конечно :)
Offline
#6 30.01.07 00:44
Re: Арифметика в С++
strike, ну, гцц... Кстати, WinAVR - это гцц :P
strike написал(а):
Разве то что ты написал не скомпилится на С ??? :)
А разве это - законченная программа для МК? ;-)
Си или асма - не поддерживают шаблоны классов. А штука вполне полезная... :) Естественно, когда придется писать столько кода, что не будет умещаться - придется оптимизировать ручками на уровне асмы. А пока - ...
Так что, на чем кодить - дело вкуса и привычки. Все равно, что спорить - что лучше, Жава или C# :) Всему - свое.
Offline
#8 30.01.07 09:17
Re: Арифметика в С++
ratus, Не совсем. Конечно же, должно было быть
Код::
itemp = ctemp1; itemp1 = (itemp1 << 8) | ctemp2;
Ответить на заданный вопрос помогла ситуация вроде:
Код::
long i; i = 555 * 222;
Когда на вторую строчку выдался Warning, мол, результат-то не интовый! Решение:
Код::
long i; i = 555L * 222L;
И никаких варнингов :)
Стало быть, в приложении к первому вопросу, можно перестраховаться так:
Код::
int char_ee::setaddr(int param)
{
char ctemp1, ctemp2;
.....
return ((int)ctemp1 << 8) | ctemp2;
}Исправлено asp (30.01.07 09:21)
Offline
#10 30.01.07 14:11
#11 30.01.07 18:17
#12 30.01.07 18:26
#13 30.01.07 19:52
Re: Арифметика в С++
asp написал(а):
Ну, во-первых, тогда уж ctemp2,
в этом примере:
asp написал(а):
itemp = ctemp1;
itemp1 = (itemp1 << 8) | ctemp2;
return itemp;
функция вернет значение ctemp1, я настаиваю
вообще советую почитать про явное и неявное преобразование типов в С
а при сдвигах обращать внимание на типы данных, с которыми производятся операции. эта тема - результат невнимательности и отсутствия понимания базовых вещей :)
Offline
#14 30.01.07 23:11
#15 30.01.07 23:13
Re: Арифметика в С++
А здесь я был в ауте....
Коль уж нАто пОшло :))

матчасть оно, конечно, хорошо, но все же толкового объяснения я не смог найти, что к какому типу будет приведено - потому и родилась эта тема. Спасибо отозвавшимся... Следственный эксперимент... Все равно интересует первый вопрос - как ДОЛЖНО быть в НОРМАЛЬНОМ [ ;-) ] компилере?
Исправлено asp (30.01.07 23:16)
Offline
#16 31.01.07 00:29
#17 31.01.07 00:44
Re: Арифметика в С++
Matrim, меняно явно ошибочное
Код::
itemp = ctemp1; itemp1 = (itemp1 << 8) | ctemp2;
На
Код::
itemp = ctemp1; itemp = (itemp << 8) | ctemp2;
И в-общем-то, ни о каком itemp1 речи не было?
А если придираться, то
Matrim написал(а):
в этом примере:
asp написал(а):
itemp = ctemp1;
itemp1 = (itemp1 << 8) | ctemp2;
return itemp;функция вернет значение ctemp1, я настаиваю
функция вообще ничего не вернет, компилер скажет undefined identifier :P
Offline
#18 31.01.07 01:19
Re: Арифметика в С++
не нужно использовать неявное преобразование типов
можно написать и так:
return (int)ctemp1<<8 | ctemp2;
лишние скобочки не нужны, существующий порядок приоритета операторов позволяет их не ставить
проблемы 2:
1. нельзя допустить потерю точность в процессе вычислений
2. нельзя допустить потерю точности в процессе сохранения результата в lvalue
с lvalue все просто, коробочка должна быть достаточно большой.
проблема в вычислениях, намного хуже, т.к. нельзя полагаться на неявное преобразование типов, зависимость от фазы луны никому нафиг не нужна.
Offline
#19 31.01.07 01:48
#20 31.01.07 17:42
Re: Арифметика в С++
asp написал(а):
Смайлек, char - 8-битный, int - 16-битный. Разница в 8 бит смущает...
В том-то и дело, что смущает :) .
К сожалению, нету под рукой мана по сям, но таки настаиваю, что побитовые операции именно для char определены.
asp, попробуй поменять типы переменных, посмотри, что будет.
И, кажися, написать таки надо так:
asp написал(а):
return ((int)(ctemp1 << 8) | ctemp2);
}
Да, и вернет она тебе таки ctemp2.
Offline
#21 31.01.07 17:51
#22 01.02.07 22:57
#23 01.02.07 23:19
Re: Арифметика в С++
irbis, Сейчас уже может быть :) А в микроконтроллерах, по крайней мере, 8-битных и тех компиляторах, которые я знаю, понятия языка практически те же, что и у языка, описанного Вадимом Валерьевичем (если не ошибаюсь) Подбельским :) А именно (Язык Си++:Учеб. пособие. - 5-е изд. - М.: Финансы и статистика, 2001 на странице 21) имеем талбичку, в ней строчку, где сказано, что int принимает значения от 0x0000 до 0x7FFF и далее unsigned int от 0x8000 до 0xFFFF. О как... Не понЯл... Бред какой... пошел учить матчасть.
З.Ы. Это для выбора констант :)) типа читать в обратную сторону. Для чисел от 32768 (0x10000) уже надо брать long, инта на них не хватит.
Offline


