我有一个函数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};
这只是一个警告,代码可以正常工作(我认为),但是为什么这会缩小转换范围?我已经尝试确保几乎所有内容都是字节...
所以,我想我已经找到了答案,这要感谢一些评论者。
不管原始操作数是什么,按位或运算似乎都返回int
。然后,如果我使用该返回值并将其转换为byte
,它将不再给出错误:
byte out[3] = {(byte)((getID())|B10000000), B00000001, B00000001};
[这是我没有尝试过的东西,这要归功于使我学会了这一点的各种评论者。
如果您看到警告,您会注意到它在括号内强制转换了函数的返回值。
(int)(((unsigned char)((int)getID())) | 128)'
// ^ ^ ^ ^ ^ ^ ^
尝试摆脱它,看看会发生什么。