2013-04-05 57 views
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 

编译器是IAR EWARM 为什么要两个char变量需要转换为int的警告。为什么它应该在一切声明为无符号时抱怨标志改变?

任何想法用什么来摆脱这个警告?

+0

试着铸造'〜pattern' – 2013-04-05 15:51:59

+0

''(datum)〜pattern'不会改变'〜'在'int'上运行的事实。理论上,实现可以采用'pattern',将其转换为'int',反转所有位,将结果解释为补码数,并将其转换为'datum'。然后,结果会从期望的结果中脱离。 – 2013-04-05 15:58:15

+0

@DanielFischer假设我喜欢'antipattern = -pattern;'我会得到警告吗?...因为我没有得到警告 – 2013-04-05 16:10:46

回答

4

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

一旦操作数是一个int,它被签署,而~运营商可能会给你意想不到的效果,因为有符号整数语义及其位表示不能完全被C.指定的编译器警告有益你这个。您可以使用antipattern = ~ (unsigned int) pattern;。通过unsigned int,您可以保证该值以简单的二进制表示。

+0

3分钟内回复。泰克人。我知道这会引起一些讨论,因为它不容易找出标准C的行为。 antipattern =〜(unsigned int)模式;确实解决了这个问题。 – 2013-04-05 16:05:50

+0

嗨,Eric!我有一个问题:假设我喜欢'antipattern = -pattern;'(我正在使用minus)我会得到警告吗?...因为我没有得到警告 – 2013-04-05 16:11:55

+1

@GrijeshChauhan:'-'运算符正在做算术运算,算术主要定义在整数上;例如,3的“-”是-3,-2的“-”是2。 '〜'是不同的,因为它操作的是值的表示位而不是值本身。 C没有说明有符号整数是使用补码还是二进制补码(尽管后者今天被压倒性地使用),所以我们不知道'-2'的位是什么,所以'〜-2'的结果是有问题的。 – 2013-04-05 16:15:45