这段代码出了什么问题
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。当一切都被宣布为无符号时,为什么要抱怨改变符号。
知道使用什么演员来摆脱这个警告吗?
答案 0 :(得分:4)
C的规则要求将unsigned char
个操作数转换为int
(反常的C实现除外)。
一旦操作数为int
,它就会被签名,~
运算符可能会给你带来意想不到的结果,因为有符号整数及其位表示的语义不是由C完全指定的。编译器有助于警告你。
您应该使用antipattern = ~ (unsigned int) pattern;
。使用unsigned int
,可以保证该值用简单的二进制表示。