Есть какая-то функция
Код: Выделить всё
if((0b100010000000000001 &(1<<15))!=0) {
return 1;
} else {
return 0;
}Такое чувство, что оно только умеет считать до 16бит. Что я не так делаю?
Всем спасибо.
Код: Выделить всё
if((0b100010000000000001 &(1<<15))!=0) {
return 1;
} else {
return 0;
}Явно - это как?a_skr писал(а):а если явно long задать?
if((0b100010000000000001L &(1L<<15))!=0)
Присмотритесь в код. Букву L видите? Вот это и есть явно. По умолчанию, верно замечено, только 16 бит.coding писал(а):Явно - это как?a_skr писал(а):а если явно long задать?
if((0b100010000000000001L &(1L<<15))!=0)
Нужно быть где-то в глубине души готовым к тому, что long может быть и 64 бита. Ну вот придётся писать библиотечку обмена со своим устройством для работы из Linux/64 и по неосторожности получите что-то типа того, что FTDI подарила (лучше бы уже не трогали, раз промахнулись поначалу).a_skr писал(а):определяется типом при объявлении переменной. например long - 32 бита, char - 8 и т.д.
Привыкайте не на 8, а на CHAR_BITS -- тогда точно проблем не будет никогда.a_skr писал(а):можно sizeof использовать, умноженный на 8, но это не совсем "программно", т.к. вычисляется на этапе компиляции.
Код: Выделить всё
#include <limits.h> // Тут же и CHAR_BITS определёня для себя даже придумать такую ситуацию не могу, где бы это понадобилосьavreal писал(а):Привыкайте не на 8, а на CHAR_BITS -- тогда точно проблем не будет никогда.
Не читаете мануалы. По умолчанию явно записанные константы в C имеют тип int. А разрядность int надо уточнять в доках на конкретный компилятор.Что я не так делаю?
Я бы предложил привыкать использовать stdint.h и его intNN_t. Вот там разрядность точно гарантируется.Нужно быть где-то в глубине души готовым к тому, что long может быть и 64 бита. ... Привыкайте не на 8, а на CHAR_BITS
* Сам давно им пользуюсь.YS писал(а):Я бы предложил привыкать использовать stdint.h и его intNN_t. Вот там разрядность точно гарантируется.
Код: Выделить всё
uint8_t i = 255; // займёт одну ячейку памяти в 16 бит
...
i = i + 1; // будет произведено маскирование после инкремента
...
if (i != 0) puts("Всё пропало, шеф!")Это понятно. Но, если не играться с указателями, то ничего не сломается, потому что компилятор понимает, что от такой переменной ждут восьмибитного поведения.Строго говоря, гарантируется не разрядность а поведение.