C不是操作员为什么我会收到警告

时间:2013-04-05 15:51:18

标签: 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 

编译器是IAR EWARM 为什么需要将两个char变量转换为int。当一切都被宣布为无符号时,为什么要抱怨改变符号。

知道使用什么演员来摆脱这个警告吗?

1 个答案:

答案 0 :(得分:4)

C的规则要求将unsigned char个操作数转换为int(反常的C实现除外)。

一旦操作数为int,它就会被签名,~运算符可能会给你带来意想不到的结果,因为有符号整数及其位表示的语义不是由C完全指定的。编译器有助于警告你。

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