Помогите разобраться с битовой инверсией в Serial
- Войдите на сайт для отправки комментариев
Чт, 03/09/2020 - 07:34
Начинаю осваивать битовые операции и столкнулся с интересным результатом:
есть код:
void setup() { Serial.begin(9600); byte c,b = 50; //0b00110010 c = ~b; //0b11001101 Serial.println(c, BIN); Serial.println(~b, BIN); Serial.println(~b); }
в мониторе порта следующий результат:
11001101
11111111111111111111111111001101
-51
Почему Serial странно инвертирует бит? хотя с инвертируемой переменной (с) все ок
А чего не понятного ?
Выводимый тип данных не указан , а компилятор решил, что выводить будет 32 бита.
Ну и вот на этот 32 битный 0 ты инверсию и кидаешь.
Почему это происходит именно так и куда девается неявное приведение типов, нужно смотреть в дебрях библиотеки. Ну или использовать явное приведение.
с переменной (с) я тоже тип не указываю, темнеменее корректно выводится
При BIN лидирующие нули не выводятся, например.
с переменной (с) я тоже тип не указываю, темнеменее корректно выводится
Так ты ее выводишь, как переменную 'с' которая объявлена как byte.
В случае с '~b' функция выводит не 'b' , а ее инверсию.
Битовая операция внутри функции.
Выполни приведение типов, если нет желания самостоятельно разбираться с библиотекой и тем как это работает.
Serial.println((byte)~b,BIN);
Я с телефона мне негде посмотреть.
Возможно функция Serial.print() , с параметром "BIN" работает с целыми числами только формата long.
Тогда именно так и будет происходить.
В любом случае посмотреть это можно только в исходниках библиотеки.
Ок, спс за совет. Думал в сериал отправляется сразу инверсный байт, а не функция.
Глянул в исходники на гитхабе, да действительно:
Serial.print() и Serial.println(), это надстройки над Serial.write(), которая в конструкторе объявлена Serial.write(long n);
Ок, спс за совет. Думал в сериал отправляется сразу инверсный байт, а не функция.
Надо не думать - додумывать, а просто посмотреть мануалы и не будет интересных результатов, а будет точно прогнозируемый.