This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430F1611:按位反转和 IF 表达式

Guru**** 2390640 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/708267/compiler-msp430f1611-bitwise-invert-and-if-expression

器件型号:MSP430F1611

工具/软件:TI C/C++编译器

您好!

我有一个问题是由于编译代码时遇到了一些奇怪的问题。

int test (char * header){
if (header[0]=~header[1]){
返回0;
}
返回1;
} 

此代码不起作用。 如果第二个字节是第一个字节的按位反转、则不返回0。 但以下代码可以正常工作:

int test (char * header){
char test[2];
test[0]= header[0];
test[1]=~header[1];
if (test[0]= test[1]){
返回0;
}
返回1;
} 

有人能解释一下为什么会发生这种情况吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可能是因为~头[1]返回的是 int、而不是 char。 您必须将其转换为 char:(char)(~header[1])、这可能会为您提供警告。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以通过添加以下代码来验证这确实是这样的:

    size_t t1、t2;

    t1 = sizeof (header1[1]);// t1 = 1;
    t2 = sizeof (~header1[1]);// t2 = 4
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、谢谢。

    我可以验证这一点。 编译~header[0]时、它使用 XOR.W -1、该值返回16位整数而不是字符:

    当反相0x14时、它会产生一个0xFFEB、而不是0xEB。

    向(char)、(signed char)或(unsigned char)添加强制转换可解决此问题。 然后、其汇编器代码使用 XOR.B -1!

    非常感谢!