Страница 1 из 1

Проблема с unsigned long

Добавлено: 18 мар 2019, 13:44
mihey78
Здравствуйте!
Не могу справиться с задачей собрать число типа unsigned long из отдельных битов с помощью операции ИЛИ
Для младшеих двух байтов все работает, а старшие два байта принимают ошибочные с моей точки зрения значения.
Я понимаю, что можно заменить 32-битное число отдельными байтами, но у меня биты передаются в функцию, их число может быть различно - от 1 до 20 и для удобства вызова этой функции я решил использовать длинное число без знака.

Мои биты:

Код: Выделить всё

#define bit0 1
#define bit1 3
//...здесь определены все биты
#define bit19 0x800000

Объявление функции:

Код: Выделить всё

void myFunc(unsigned long mask){
//здесь разбиваю на байты и получаю бред в третьем байте( и в четвертом, если его использовать)
unsigned char mask0 = mask & 0xFF;
unsigned char mask1 = (mask >>8)  & 0xFF;
unsigned char mask3 = (mask >>16) & 0xFF;
};

Вызываю ее:

Код: Выделить всё

myFinc(bit6|bit0|...|bit19|bit3);

в третьем байте - проблема

Для проверки написал вот это, все наглядно:

Код: Выделить всё

unsigned long ul = 0;
void setup() {
 Serial.begin(9600);
  for (byte j = 0; j < 32; j++){
     ul |= (1 << j);
     Serial.print(j);
     Serial.print(" : ");
     Serial.println(ul,BIN);
     delay(100);
    }
 }
void loop() {
 }


В чем моя ошибка?

Re: Проблема с unsigned long

Добавлено: 27 мар 2019, 22:53
Эдуард
Здравствуйте!
Попробуйте вот так.

Код: Выделить всё

unsigned long ul = 0;
void setup() {
 Serial.begin(9600);
  for (byte j = 0; j < 32; j++){
     ul |= (1L << j);
     Serial.print(j);
     Serial.print(" : ");
     Serial.println(ul,BIN);
     delay(100);
    }
 }
void loop() {
 }


Откуда компилятор знает, что вы используете 1 в формате long. По умолчанию - int.