Например TDA7294

Форум РадиоКот • Просмотр темы - Не правильно работает побитовая операция смещения
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн июл 28, 2025 01:32:31

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 14:32:25 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт ноя 25, 2011 18:20:52
Сообщений: 92
Рейтинг сообщения: 0
Не правильно работает операция смещения либо я чего-то (как я думаю) не знаю.
Есть какая-то функция
Код:
     if((0b100010000000000001 &(1<<15))!=0) {
         return 1;
     } else {
            return 0;
     }


Как я думаю, функция должна вернуть 0, а возвращает 1 (это на 16-м бите), на 17,18 - возвращает постоянно 0.
Такое чувство, что оно только умеет считать до 16бит. Что я не так делаю?
Всем спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 14:49:34 
Вымогатель припоя

Карма: 22
Рейтинг сообщений: 114
Зарегистрирован: Пн июн 14, 2010 13:07:29
Сообщений: 630
Откуда: Жуковский
Рейтинг сообщения: 0
а если явно long задать?
if((0b100010000000000001L &(1L<<15))!=0)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 14:50:09 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт ноя 25, 2011 18:20:52
Сообщений: 92
Рейтинг сообщения: 0
a_skr писал(а):
а если явно long задать?
if((0b100010000000000001L &(1L<<15))!=0)


Явно - это как?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 14:51:48 
Потрогал лапой паяльник
Аватар пользователя

Зарегистрирован: Вт сен 11, 2007 10:27:08
Сообщений: 335
Откуда: Киев
Рейтинг сообщения: 0
coding писал(а):
a_skr писал(а):
а если явно long задать?
if((0b100010000000000001L &(1L<<15))!=0)


Явно - это как?


Присмотритесь в код. Букву L видите? Вот это и есть явно. По умолчанию, верно замечено, только 16 бит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 14:55:58 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт ноя 25, 2011 18:20:52
Сообщений: 92
Рейтинг сообщения: 0
Да, увидел, после того как отправил.
Уже проверяю.
===
Уже проверил!! Работае. Спасибо оргомное! Тепер буду знать!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 15:30:14 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт ноя 25, 2011 18:20:52
Сообщений: 92
Рейтинг сообщения: 0
И еще вопрос, а как программно можно узнать сколько бит в числе?


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 16:13:36 
Вымогатель припоя

Карма: 22
Рейтинг сообщений: 114
Зарегистрирован: Пн июн 14, 2010 13:07:29
Сообщений: 630
Откуда: Жуковский
Рейтинг сообщения: 0
определяется типом при объявлении переменной. например long - 32 бита, char - 8 и т.д.
можно sizeof использовать, умноженный на 8, но это не совсем "программно", т.к. вычисляется на этапе компиляции.


Последний раз редактировалось a_skr Пн июл 09, 2012 16:15:35, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 16:14:15 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт ноя 25, 2011 18:20:52
Сообщений: 92
Рейтинг сообщения: 0
Понял, спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Пн июл 09, 2012 18:38:01 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
a_skr писал(а):
определяется типом при объявлении переменной. например long - 32 бита, char - 8 и т.д.
Нужно быть где-то в глубине души готовым к тому, что long может быть и 64 бита. Ну вот придётся писать библиотечку обмена со своим устройством для работы из Linux/64 и по неосторожности получите что-то типа того, что FTDI подарила (лучше бы уже не трогали, раз промахнулись поначалу).
Или окажется 16 бит, как для avr-gcc с ключиком -mint8 (int становится 8 бит, long -- 16, это отклонение от стандарта и уже не рекомендуется к использованию, но оно есть/было).
char реже скачет, но на некоторых TMS320 он 16-битный (но при этом sizeof(char) == 1 всё равно, так как это «по определению»).

a_skr писал(а):
можно sizeof использовать, умноженный на 8, но это не совсем "программно", т.к. вычисляется на этапе компиляции.
Привыкайте не на 8, а на CHAR_BITS -- тогда точно проблем не будет никогда.
Ну и да, кстати, кое-что можно не на этапе компиляции, а на этапе препроцессинга для условной компиляции.
Код:
#include <limits.h> // Тут же и CHAR_BITS определён
И тут куча определений по мин/макс значениям для родных целочисленных типов для данной платформы (контроллер/режим/компилятор). По плавающим -- float.h.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Вт июл 10, 2012 08:14:08 
Вымогатель припоя

Карма: 22
Рейтинг сообщений: 114
Зарегистрирован: Пн июн 14, 2010 13:07:29
Сообщений: 630
Откуда: Жуковский
Рейтинг сообщения: 0
avreal писал(а):
Привыкайте не на 8, а на CHAR_BITS -- тогда точно проблем не будет никогда.
я для себя даже придумать такую ситуацию не могу, где бы это понадобилось ;) надеюсь, привыкать не придется.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Вт июл 10, 2012 19:05:04 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1247
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
Что я не так делаю?


Не читаете мануалы. По умолчанию явно записанные константы в C имеют тип int. А разрядность int надо уточнять в доках на конкретный компилятор.

Цитата:
Нужно быть где-то в глубине души готовым к тому, что long может быть и 64 бита. ... Привыкайте не на 8, а на CHAR_BITS


Я бы предложил привыкать использовать stdint.h и его [u]intNN_t. Вот там разрядность точно гарантируется.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Ср июл 11, 2012 09:40:09 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
YS писал(а):
Я бы предложил привыкать использовать stdint.h и его [u]intNN_t. Вот там разрядность точно гарантируется.
* Сам давно им пользуюсь.

* До сих пор могут встречаться компиляторы, не имеющие его в поставке (по крайней мере пару лет назад на такое обижались). Оно из С99, а некоторые компиляторы этот стандарт не поддерживают (хотя уж include-файл-то можно было бы добавить).

* Строго говоря, гарантируется не разрядность а поведение. Т.е. на машине с минимально-адресуемой единицей памяти в 16 бит тип uint8_t не сможет занять меньше 16 бит. Но при операциях с ним компилятор будет должен производить маскирование &= 0xFF, чтобы работало как если бы он 8 бит.
Код:
    uint8_t i = 255; // займёт одну ячейку памяти в 16 бит
    ...
    i = i + 1; // будет произведено маскирование после инкремента
    ...
    if (i != 0) puts("Всё пропало, шеф!")

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Не правильно работает побитовая операция смещения
СообщениеДобавлено: Ср июл 11, 2012 18:20:55 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 1247
Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7517
Рейтинг сообщения: 0
Цитата:
Строго говоря, гарантируется не разрядность а поведение.


Это понятно. Но, если не играться с указателями, то ничего не сломается, потому что компилятор понимает, что от такой переменной ждут восьмибитного поведения.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y