为什么此按位运算是“从'int'到'byte'的狭窄转换”? -Arduino

问题描述 投票:2回答:2

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

这只是一个警告,代码可以正常工作(我认为),但是为什么这会缩小转换范围?我已经尝试确保几乎所有内容都是字节...

c++ arduino arduino-uno
2个回答
2
投票

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

不管原始操作数是什么,按位或运算似乎都返回int。然后,如果我使用该返回值并将其转换为byte,它将不再给出错误:

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

[这是我没有尝试过的东西,这要归功于使我学会了这一点的各种评论者。


-3
投票

如果您看到警告,您会注意到它在括号内强制转换了函数的返回值。

(int)(((unsigned char)((int)getID())) | 128)'
//                     ^ ^ ^ ^ ^ ^ ^

尝试摆脱它,看看会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.