4

这段代码有什么问题

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。当一切都被宣布为无符号时,它为什么要抱怨符号的变化。

知道要使用什么演员来消除此警告吗?

4

1 回答 1

5

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

一旦操作数是int,它就是有符号的,并且~操作符可能会给你意想不到的结果,因为有符号整数的语义和它们的位表示没有完全由 C 指定。编译器会帮助你警告这一点。

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

于 2013-04-05T15:55:44.023 回答