如何避免"对已签名数据的按位运算将给出实现定义的结果"在QAC?

时间:2015-04-13 10:56:03

标签: c qa-c

我正在

  

Msg(3:4130)对签名数据的按位运算将给出实现定义的结果

在QAC中发出此警告。像

这样的代码
functionName( a | b | c);

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

6 个答案:

答案 0 :(得分:3)

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

这就是警告告诉你的。

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

答案 1 :(得分:1)

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

  
      
  1. 有符号幅度:第一位为0,则数字为正,如果第一位为1,则数字为负。

  2.   
  3. 2&#39>补充

  4.   
  5. 1&#39>补充

  6.   

所以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中的-02's complement中的-1

答案 5 :(得分:0)

负数有不同的表示方案,
例如这三个(使用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)

这就是"实施定义"意味着,取决于您的编译器:

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

"将这些变量的值视为负数,
只是因为最高位是1,
是愚蠢的,他们只是位!"你说呢? 或许,"值永远不会如此之高,并且绝对不会在语义上消极。"

那么,不要为他们使用signed int 那是QAC想要告诉你的。

如果你碰巧不知道它,
我敢打赌,你永远不会猜到你的编译器代表什么 (或者至少是今天用于实际硬件实现的ALU的大多数编译器)。