реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поясните где неправ, при использовании поразрядного сдвига
kolobochishe
сообщение Feb 16 2012, 11:55
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Восстанавливаю из побайтового массива 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 поле.

Сообщение отредактировал kolobochishe - Feb 16 2012, 11:58
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 16 2012, 12:12
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (kolobochishe @ Feb 16 2012, 13:55) *
Вопрос: Почему второй вариант оставляет 0 ?
Какой ноль? Где оставляет? Как объявлен DataArr?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Feb 16 2012, 12:15
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



void GetRSInfo(struct RSInfo * RS_Info, unsigned char * DataArr)

Ноль оставляет в значении поля TotalAmp в случае если использую сдвиг.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 16 2012, 12:33
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Кстати, приведение к unsigned int необязательно - оно делается неявно согласно правил расширения целых типов (integer promotion rules).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 16 2012, 12:52
Сообщение #5



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(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;
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Feb 17 2012, 03:24
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(Сергей Борщ @ 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" и сложение - это одно и то же

Сообщение отредактировал kolobochishe - Feb 17 2012, 03:26
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 20:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01327 секунд с 7
ELECTRONIX ©2004-2016