Как я думаю, функция должна вернуть 0, а возвращает 1 (это на 16-м бите), на 17,18 - возвращает постоянно 0. Такое чувство, что оно только умеет считать до 16бит. Что я не так делаю? Всем спасибо.
определяется типом при объявлении переменной. например long - 32 бита, char - 8 и т.д. можно sizeof использовать, умноженный на 8, но это не совсем "программно", т.к. вычисляется на этапе компиляции.
Последний раз редактировалось a_skr Пн июл 09, 2012 16:15:35, всего редактировалось 1 раз.
определяется типом при объявлении переменной. например 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.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Я бы предложил привыкать использовать 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("Всё пропало, шеф!")
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Строго говоря, гарантируется не разрядность а поведение.
Это понятно. Но, если не играться с указателями, то ничего не сломается, потому что компилятор понимает, что от такой переменной ждут восьмибитного поведения.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения