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
    进行比较,发现相等