此代码有什么问题
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。当所有内容都声明为未签名时,为什么还要抱怨符号更改。
任何想法都可以用来摆脱此警告吗?
C的规则要求将unsigned char操作数转换为int(不正确的C实现中除外)。
一旦操作数是an int,就对其进行签名,并且~运算符可能会给您带来意想不到的结果,因为C不能完全指定带符号整数的语义及其位表示形式。编译器会对此进行警告。
您应该使用antipattern = ~ (unsigned int) pattern;。使用unsigned int,可以确保该值用简单的二进制表示。