为什么这个按位运算是"narrowing conversion from 'int' to 'byte'"?- 阿杜伊诺



我有一个函数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};

这只是一个警告,代码运行良好(我认为(,但为什么这是一个缩小的转换?我试着确保所有东西都是一个字节。。。

所以我想我已经找到了答案,感谢一些评论者。

无论原始操作数是什么,逐位OR运算似乎都会返回int。如果我取返回的值并将其强制转换为byte,它将不再给出错误:

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

这是我没有尝试过的,多亏了各种各样的评论者引导我学会了这一点。

最新更新