Почему эта побитовая операция является «сужающим преобразованием из« int »в« byte »»? - Arduino - PullRequest
1 голос
/ 04 апреля 2020

У меня есть функция getID(), которая возвращает байт из EEPROM:

byte getID(){
  return (byte)EEPROM.read(0x0199);
}

Позже, (в строке 65), я использую эту функцию и побитовое ИЛИ с двоичным значением:

byte out[3] = {getID()|B10000000, B00000001, B00000001};
Serial.write(out,3);

и возвращает "сужающее преобразование из 'int' в 'byte":

file.ino:65:33: warning: narrowing conversion of '(int)(((unsigned char)((int)getID())) | 128)' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]

     byte out[3] = {(getID())|B10000000, B00000001, B00000001};

Это просто предупреждение, и код работает нормально (я думаю), но почему это сужение конверсии? Я пытался убедиться, что почти все является байтом ...

1 Ответ

2 голосов
/ 04 апреля 2020

Так что я думаю, что нашел свой ответ тогда, благодаря некоторым комментариям.

Кажется, что операция Bitwise-OR возвращает int, независимо от того, какими были исходные операнды. Если я затем возьму это возвращенное значение и приведу его как byte, оно больше не выдаст ошибку:

byte out[3] = {(byte)((getID())|B10000000), B00000001, B00000001};

Это то, что я не пробовал, благодаря различным комментариям, которые привели меня к изучению это.

...