Arduino 按位NOT和比较的无符号与有符号问题
经过一番深思熟虑之后,我发现有符号和无符号字符在==符号方面有着惊人的区别Arduino 按位NOT和比较的无符号与有符号问题,arduino,Arduino,经过一番深思熟虑之后,我发现有符号和无符号字符在==符号方面有着惊人的区别 void loop() { } void setup() { unsigned char ucA = 0x55; unsigned char ucB = 0xAA; unsigned char ucB_not; char cA = 0x55; char cB = 0xAA; Serial.begin( 115200); if ( ucA == ~ucB) Serial.prin
void loop()
{
}
void setup()
{
unsigned char ucA = 0x55;
unsigned char ucB = 0xAA;
unsigned char ucB_not;
char cA = 0x55;
char cB = 0xAA;
Serial.begin( 115200);
if ( ucA == ~ucB)
Serial.println( "unsigned -- match");
else
Serial.println( "unsigned -- no match");
if ( cA == ~cB)
Serial.println( "signed -- match");
else
Serial.println( "signed -- no match");
ucB_not = ~ucB;
if ( ucA == ucB_not)
Serial.println( "unsigned, seperate variable -- match");
else
Serial.println( "unsigned, seperate variable -- no match");
}
我得到的结果是:
unsigned -- no match
signed -- match
unsigned, seperate variable -- match
在比较之前是否有一些规则使值变宽?即使如此,未签名的案例也不应该是问题,对吗
我添加了最后一种情况——创建一个单独的变量似乎没有问题
<>我在C和C++中使用ARDUIO 1.0.5.0./P>< P>,整数类型的算子的操作数比int小。如果较小的类型是有符号的,则提升的类型是有符号扩展的-有符号字符值
-x
被提升为具有相同值-x
的有符号整数,这在2的补码机器中意味着在其前面加上一些0xff
字节。如果操作的结果被分配回较小的类型,则该类型将被截断
您的三个案例适用以下规则:
0xaa
升级为无符号整数0x00aa
,无符号字符0x55
升级为无符号整数0x0055
。反转0x00aa
会得到0xff55
,它不等于0x0055
0xaa
升级为有符号整数0xffaa
(负符号值扩展为符号-有符号字符值-86
升级为有符号整数-86
),有符号字符0x55
升级为有符号整数0x0055
(正有符号字符值+85
被提升为有符号int值+85
)。反转0xffaa
得到0x0055
,等于0x0055
0xaa
升级为无符号整数0x00aa
,反转为0xff55
,然后存储为无符号字符,导致其被截断为0x55
。无符号字符0x55
稍后与无符号字符0x55
进行比较,发现相等