C不是运算符,为什么会收到警告

Sim*_*ees 4 c

此代码有什么问题

typedef unsigned char datum; /* Set the data bus width to 8 bits. */

    datum pattern;
    datum antipattern;

    antipattern = ~pattern;


Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) C:\filepath...\file.c 386 
Run Code Online (Sandbox Code Playgroud)

编译器是IAR EWARM,为什么需要将两个char变量转换为int。当所有内容都声明为未签名时,为什么还要抱怨符号更改。

任何想法都可以用来摆脱此警告吗?

Eri*_*hil 5

C的规则要求将unsigned char操作数转换为int(不正确的C实现中除外)。

一旦操作数是an int,就对其进行签名,并且~运算符可能会给您带来意想不到的结果,因为C不能完全指定带符号整数的语义及其位表示形式。编译器会对此进行警告。

您应该使用antipattern = ~ (unsigned int) pattern;。使用unsigned int,可以确保该值用简单的二进制表示。