Официальный сайт студ.городка НГТУ
Программирование и БД » Арифметика в С++ 

#1  29.01.07 17:43

asp
Профиль

Арифметика в С++

Подскажите, пожалуйста, насколько корректен код:

Код: 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

#2  29.01.07 20:16

Re: Арифметика в С++

Да на плюсах под МК лучше не писать, а для ответа на вопрос лучше откомпилить и посмотреть что нагородил компилятор ,)

Offline

#3  29.01.07 20:45

Re: Арифметика в С++

имхо, хороший компилятор соптимизирует второй вариант в первый

Offline

#4  29.01.07 21:23

asp
Профиль

Re: Арифметика в С++

Смайлек, не фаХт... как раз-таки, ХОРОШИЙ - не соптимизирует :)
strike, опять же, не согласен. Времени выигрывается вагон, а проигрыш мизерный. Тот же IAR выдает asm'овский код практически в идеальном виде. Если что-то необходимо, можно уже там подправлять. ИМХО, конечно :)

Offline

#5  29.01.07 22:51

Re: Арифметика в С++

имхо, имхо... но вот на плюсах под МК уж точно не пишут. Слишком много городит компилятор для поддержки С++, пиши на С. Разве то что ты написал не скомпилится на С ??? :)
Хороший компилер еще не такое оптимизирует :) например gcc

Offline

#6  30.01.07 00:44

asp
Профиль

Re: Арифметика в С++

strike, ну, гцц... Кстати, WinAVR - это гцц :P

strike написал(а):

Разве то что ты написал не скомпилится на С ??? :)

А разве это - законченная программа для МК? ;-)

Си или асма - не поддерживают шаблоны классов. А штука вполне полезная... :) Естественно, когда придется писать столько кода, что не будет умещаться - придется оптимизировать ручками на уровне асмы. А пока - ...

Так что, на чем кодить - дело вкуса и привычки. Все равно, что спорить - что лучше, Жава или C# :) Всему - свое.

Offline

#7  30.01.07 01:41

Re: Арифметика в С++

asp написал(а):

itemp = ctemp1;
  ctemp1 = (ctemp1 << 8) | ctemp2;

я вот тут подумал... не наоборот ли эти строчки?

Offline

#8  30.01.07 09:17

asp
Профиль

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

#9  30.01.07 11:25

Re: Арифметика в С++

asp написал(а):

return ((int)ctemp1 << 8) | ctemp2;
}

вот эта строчка у тебя правильная.
Изначально у тебя некорретктно были типы определены.
Побитовые операции , если я не ошибаюсь, определены для переменных типа char

Offline

#10  30.01.07 14:11

Re: Арифметика в С++

скажем так, для целочисленных. В число которых как раз попадает char.

Offline

#11  30.01.07 18:17

Re: Арифметика в С++

asp написал(а):

itemp = ctemp1;
itemp1 = (itemp1 << 8) | ctemp2;
return itemp;

с таким же успехом можно написать return ctemp1

при sizeof(char) равном 1 сдвиг на 8 влево эквивалентен использованию 0

Offline

#12  30.01.07 18:26

asp
Профиль

Re: Арифметика в С++

Matrim, Ну, во-первых, тогда уж ctemp2, а во-вторых... во-вторых, так да не так :-/ было б так, вопрос бы не возникал.
Смайлек, char - 8-битный, int - 16-битный. Разница в 8 бит смущает...

Исправлено asp (30.01.07 18:27)

Offline

#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

asp
Профиль

Re: Арифметика в С++

Matrim написал(а):

функция вернет значение ctemp1, я настаиваю

Я тоже настаиваю:

http://hostel.nstu.ru/uploaded/gallery/3316_1170177029.jpg

Offline

#15  30.01.07 23:13

asp
Профиль

Re: Арифметика в С++

А здесь я был в ауте....
Коль уж нАто пОшло :))

http://hostel.nstu.ru/uploaded/gallery/3316_1170177202.jpg



матчасть оно, конечно, хорошо, но все же толкового объяснения я не смог найти, что к какому типу будет приведено - потому и родилась эта тема. Спасибо отозвавшимся... Следственный эксперимент... Все равно интересует первый вопрос - как ДОЛЖНО быть в НОРМАЛЬНОМ [ ;-) ] компилере?

Исправлено asp (30.01.07 23:16)

Offline

#16  31.01.07 00:29

Re: Арифметика в С++

это же разные куски кода
исправлять на ходу и говорить что ничего небыло - это корявый подлог, все равно написано кто когда тему правил :)

Offline

#17  31.01.07 00:44

asp
Профиль

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

asp
Профиль

Re: Арифметика в С++

Matrim, премного благодарствую.

З.Ы. со скобочками для глазного парсера удобнее :) а если точнее, то пошло от val = (1 << BITS1) | (1 << BITS2) | (1 << BITS3)
Где BITS1...3 заранее определены через #define

Исправлено asp (31.01.07 01:49)

Offline

#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

asp
Профиль

Re: Арифметика в С++

Комиссар, на картинках то, что она возвращает. Вторая картинка, с неявным преобразованием...

Offline

#22  01.02.07 22:57

Re: Арифметика в С++

asp написал(а):

Смайлек, char - 8-битный, int - 16-битный. Разница в 8 бит смущает...

Если уж говоррим про С++, то смотрим стандарт языка и видим, что int -  не 16-битный, а 32 бита

Offline

#23  01.02.07 23:19

asp
Профиль

Re: Арифметика в С++

irbis, Сейчас уже может быть :) А в микроконтроллерах, по крайней мере, 8-битных и тех компиляторах, которые я знаю, понятия языка практически те же, что и у языка, описанного Вадимом Валерьевичем (если не ошибаюсь) Подбельским :) А именно (Язык Си++:Учеб. пособие. - 5-е изд. - М.: Финансы и статистика, 2001 на странице 21) имеем талбичку, в ней строчку, где сказано, что int принимает значения от 0x0000 до 0x7FFF и далее unsigned int от 0x8000 до 0xFFFF. О как... Не понЯл... Бред какой... пошел учить матчасть.

З.Ы. Это для выбора констант :)) типа читать в обратную сторону. Для чисел от 32768 (0x10000) уже надо брать long, инта на них не хватит.

Offline

Программирование и БД » Арифметика в С++ 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 1.038 сек.
Выполнено 14 запросов.