Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поясните где неправ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kolobochishe
Восстанавливаю из побайтового массива 4-х разрядную переменную

Это работает

Код
RS_Info->TotalAmp = DataArr[10032]*0x1000000 +
                      DataArr[10033]*0x10000 +
                      DataArr[10034]*0x100  +
                      DataArr[10035];


Это не работает

Код
RS_Info->TotalAmp = ((unsigned int)DataArr[10032])<<24 +
                                 ((unsigned int)DataArr[10033])<<16 +
                                 ((unsigned int)DataArr[10034])<<8 +
                                 ((unsigned int)DataArr[10035]);


Вопрос: Почему второй вариант оставляет 0 ?
RS_Info - указатель на структуру. TotalAmp - unsigned int поле.
Сергей Борщ
QUOTE (kolobochishe @ Feb 16 2012, 13:55) *
Вопрос: Почему второй вариант оставляет 0 ?
Какой ноль? Где оставляет? Как объявлен DataArr?
kolobochishe
void GetRSInfo(struct RSInfo * RS_Info, unsigned char * DataArr)

Ноль оставляет в значении поля TotalAmp в случае если использую сдвиг.
Сергей Борщ
QUOTE (kolobochishe @ Feb 16 2012, 14:15) *
Ноль оставляет в значении поля TotalAmp в случае если использую сдвиг.
А... понял. В результате вычисления второго выражения получается ноль. Возможно потому, что операция сложения имеет больший приоритет, чем сдвиг, и сдвиг на 24 + (DataArr[10033]<<(16 +... выносит значащие биты за пределы unsigned int?

Кстати, приведение к unsigned int необязательно - оно делается неявно согласно правил расширения целых типов (integer promotion rules).
xemul
Цитата(kolobochishe @ Feb 16 2012, 16:15) *
Ноль оставляет в значении поля TotalAmp в случае если использую сдвиг.

Не устраивайте замес из арифметических и битовых операторов (или разруливайте замес скобками).
Код
RS_Info->TotalAmp = DataArr[10032]*0x1000000 + DataArr[10033]*0x10000;
RS_Info->TotalAmp = DataArr[10032]<<24 | DataArr[10033]<<16;
kolobochishe
Цитата(Сергей Борщ @ Feb 16 2012, 17:33) *
Кстати, приведение к unsigned int необязательно - оно делается неявно согласно правил расширения целых типов (integer promotion rules).


уже знаю sm.gif но стараюсь делать это явно. чтоб не сомневаться

Цитата(Сергей Борщ @ Feb 16 2012, 17:33) *
Возможно потому, что операция сложения имеет больший приоритет, чем сдвиг, и сдвиг на 24 + (DataArr[10033]<<(16 +... выносит значащие биты за пределы unsigned int?


похоже что да

Цитата(xemul @ Feb 16 2012, 17:52) *
Не устраивайте замес из арифметических и битовых операторов (или разруливайте замес скобками).


согласен sm.gif почему то мне казалось, что в данном случае "OR" и сложение - это одно и то же
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.