我正在
在QAC中发出此警告。像这样的代码Msg(3:4130)对签名数据的按位运算将给出实现定义的结果
functionName( a | b | c);
关于PIC微控制器代码的QAC。任何人都可以解释这是什么警告以及如何避免这种警告。
答案 0 :(得分:3)
不要使用有符号整数进行按位运算,请使用unsigned
。
这就是警告告诉你的。
您不会显示a
,b
和c
的类型,因此很难更具体。
答案 1 :(得分:1)
在系统中有多种方式表示负数。
有符号幅度:第一位为0,则数字为正,如果第一位为1,则数字为负。
2&#39>补充
- 醇>
1&#39>补充
所以C从不强制在不同系统中表示数字的方式,因此这一行与数字在系统中的表示方式一致。
在进行按位操作之前,您应该注意littel-endian和big-endian表示。
答案 2 :(得分:1)
在您的代码functionName( a | b | c);
您正在使用functionName
调用此函数a | b | c
,其中|
执行按位运算。对有符号整数(a,b,c)执行按位运算(|
)将返回implementation defined results。
您可以通过对变量a,b,c进行类型转换来避免此警告,如下所示
functionName( (unsigned)a | (unsigned)b | (unsigned)c)
以上代码将更改a,b,c的类型,以便可以避免QAC警告
答案 3 :(得分:1)
对签名数据(INT,LONG)的按位(|,&)操作将给出与实现相关的结果。您可以通过在执行按位运算之前使用转换为unsigned的类型来避免它。
答案 4 :(得分:0)
8位整数上的(127)|(-127)
表达式会产生1's complement中的-0
或2's complement中的-1
。
答案 5 :(得分:0)
负数有不同的表示方案,
例如这三个(使用8位示例)。
平等不同
补充2:
( - 1 | -2)
==((0xff ^ 1)+1)| ((0xff ^ 2)+1)
==(0xfe + 1)| (0xfd + 1)
==(0xff)| (0xFE的)
== 0xff
==(0xfe +1)
==((0xff ^ 1)+1)
== -1
== - (((1 + 1)&(2 + 1)) - 1)
补充1:
( - 1 | -2)
==(0xff ^ 1)| (0xff ^ 2)
==(0xfe)| (0xfd)
==(0xff)
==(0xff ^ 0x00)
== -0
== - (1& 2)
签名幅度:
( - 1 | -2)
==(0x80 | 1)| (0x80 | 2)
==(0x81)| (为0x82)
==(0x83)
==(0x80 | 3)
== -3
== - (1 | 2)
这就是"实施定义"意味着,取决于您的编译器:
(-1 | -2) == -3 == -( 1 | 2 )
(-1 | -2) == -0 == -( 1 & 2 )
(-1 | -2) == -1 == -( ((1+1) & (2+1)) -1 )
"将这些变量的值视为负数,
只是因为最高位是1,
是愚蠢的,他们只是位!"你说呢?
或许,"值永远不会如此之高,并且绝对不会在语义上消极。"
那么,不要为他们使用signed int 那是QAC想要告诉你的。
如果你碰巧不知道它,
我敢打赌,你永远不会猜到你的编译器代表什么
(或者至少是今天用于实际硬件实现的ALU的大多数编译器)。