今天空了又重温了一下C,针对之前强哥提的问题,我仔细想了下,举个例子:
假如当前buff[1]=0111 1111B; buff[2]=1000 0000B;
buff定义为char类型,一般系统隐含为signed char,
- 执行buff[1] == ~buff[2]运算时,
buff[1]由signed char自动转化为int,又因buff[1]符号位为0,则高位补0,结果为00000000 00000000 00000000 01111111B;
buff[2]由signed char自动转化为int,又因buff[1]符号位为1,则符号位扩展高位补1,结果为11111111 11111111 11111111 1000 0000B;
再执行~ buff[2],结果为00000000 00000000 00000000 01111111B;
故buff[1]==~buff[2]相等。
- 执行uint8_t data1 = ~buff[2]运算时,
buff[2]由signed char自动转化为int,又因buff[1]符号位为1,则符号位扩展高位补1,结果为11111111 11111111 11111111 1000 0000B;
其次执行~ buff[2],结果为00000000 00000000 00000000 01111111B;
再执行赋值操作时,由于data1为unsigned char,必须强制类型转换,采用截断方式,只取低8位,故data1等于01111111B;
再判断buff[1] == data1,
buff[1]由signed char自动转化为int,又因buff[1]符号位为0,则高位补0,结果为00000000 00000000 00000000 01111111B;
data1由unsigned char自动转化为int,高位直接补0,结果为00000000 00000000 00000000 01111111B;
故buff[1] == data1不相等;
综上所述,由于将buff定义为char,导致问题出现,建议将buff定义为unsigned char则可避免;或者将data1定义为char也可避免;