Помогите разобраться с битовой инверсией в Serial

DisSevsk
Offline
Зарегистрирован: 02.09.2020

Начинаю осваивать битовые операции и столкнулся с интересным результатом:

есть код:

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 странно инвертирует бит? хотя с инвертируемой переменной (с) все ок
 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А чего не понятного ?
Выводимый тип данных не указан , а компилятор решил, что выводить будет 32 бита.
Ну и вот на этот 32 битный 0 ты инверсию и кидаешь.

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

DisSevsk
Offline
Зарегистрирован: 02.09.2020

с переменной (с) я тоже тип не указываю, темнеменее корректно выводится

sadman41
Offline
Зарегистрирован: 19.10.2016

При BIN лидирующие нули не выводятся, например.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

DisSevsk пишет:

с переменной (с) я тоже тип не указываю, темнеменее корректно выводится

Так ты ее выводишь, как переменную 'с' которая объявлена как byte.
В случае с '~b' функция выводит не 'b' , а ее инверсию.
Битовая операция внутри функции.
Выполни приведение типов, если нет желания самостоятельно разбираться с библиотекой и тем как это работает.

Serial.println((byte)~b,BIN);

Я с телефона мне негде посмотреть.
Возможно функция Serial.print() , с параметром "BIN" работает с целыми числами только формата long.
Тогда именно так и будет происходить.
В любом случае посмотреть это можно только в исходниках библиотеки.

DisSevsk
Offline
Зарегистрирован: 02.09.2020

Ок, спс за совет. Думал в сериал отправляется сразу инверсный байт, а не функция.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Глянул в исходники на гитхабе, да действительно:
Serial.print() и Serial.println(), это надстройки над Serial.write(), которая в конструкторе объявлена Serial.write(long n);

nik182
Offline
Зарегистрирован: 04.05.2015

DisSevsk пишет:

Ок, спс за совет. Думал в сериал отправляется сразу инверсный байт, а не функция.

Надо не думать - додумывать, а просто посмотреть мануалы и не будет интересных результатов, а будет точно прогнозируемый.