QAC中如何避免"Bitwise operations on signed data will give implementation defined results"?

How to avoid "Bitwise operations on signed data will give implementation defined results" in QAC?

我得到

Msg(3:4130) Bitwise operations on signed data will give implementation defined results

QAC 中的此警告。代码如

functionName( a | b | c);

PIC 微控制器代码上的 QAC。任何人都可以解释。这个警告是什么以及如何避免这个警告。

负数在系统中有多种表示方式。

  1. Signed magnitude : The first bit is 0 then number is positive and if the first bit is 1 then the number is negative.

  2. 2's complement

  3. 1's complement

所以 C 从不强制规定数字在不同系统中的表示方式,因此这一行与数字在系统中的表示方式一致。

在进行按位运算之前,您应该了解小端和大端表示。

在 8 位整数上的表达式 (127)|(-127)1's complement or in -1 in 2's complement 中得到 -0

按位运算不要使用有符号整数,请使用unsigned

这就是警告告诉您的内容。

您没有显示 abc 的类型,因此很难更具体。

在你的代码中functionName( a | b | c);

您正在使用 a | b | c 调用此函数 functionName,其中 | 作为参数执行按位运算。对有符号整数 (a,b,c) 执行按位运算 (|) 将 return implementation defined results.

您可以通过如下所示对变量 a、b、c 进行类型转换来避免此警告

functionName( (unsigned)a | (unsigned)b | (unsigned)c)

The above code will change the type of a,b,c so that the QAC warning can be avoided

对有符号数据(INT,LONG) 的按位(|,&) 运算将为您提供与实现相关的结果。您可以通过在执行按位运算之前使用 by type converted to unsigned 来避免它。

负数有不同的表示方案,
例如这三个(使用 8 位示例)。

  • 补码 2 : -n == ((0xff ^ n) +1)
  • 补码 1 : -n == ((0xff ^ n))
  • 有符号大小:-n == ( 0x80 | n )

等式不同

  • 补充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 )

这就是 "implementation defined" 的意思,具体取决于您的编译器:

(-1 | -2) == -3 == -( 1 | 2 )  
(-1 | -2) == -0 == -( 1 & 2 )  
(-1 | -2) == -1 == -( ((1+1) & (2+1)) -1 )  

"考虑到这些变量的值为负,
就因为最高位是1,
是愚蠢的,他们只是比特!”你说?
或者,"The values will never be so high, and definitly not semantically negative either."

好吧,那就不要为他们使用signed int。
这就是QAC想告诉你的。

如果你还不知道,
我打赌你永远猜不到你的编译器是哪种表示法
(或至少当今大多数用于实际硬件实现的 ALU 的编译器)使用。