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。任何人都可以解释。这个警告是什么以及如何避免这个警告。
负数在系统中有多种表示方式。
Signed magnitude : The first bit is 0 then number is positive and if the first bit is 1 then the number is negative.
2's complement
1's complement
所以 C 从不强制规定数字在不同系统中的表示方式,因此这一行与数字在系统中的表示方式一致。
在进行按位运算之前,您应该了解小端和大端表示。
在 8 位整数上的表达式 (127)|(-127)
在 1's complement or in -1
in 2's complement 中得到 -0
。
按位运算不要使用有符号整数,请使用unsigned
。
这就是警告告诉您的内容。
您没有显示 a
、b
和 c
的类型,因此很难更具体。
在你的代码中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 的编译器)使用。
我得到
Msg(3:4130) Bitwise operations on signed data will give implementation defined results
QAC 中的此警告。代码如
functionName( a | b | c);
PIC 微控制器代码上的 QAC。任何人都可以解释。这个警告是什么以及如何避免这个警告。
负数在系统中有多种表示方式。
Signed magnitude : The first bit is 0 then number is positive and if the first bit is 1 then the number is negative.
2's complement
1's complement
所以 C 从不强制规定数字在不同系统中的表示方式,因此这一行与数字在系统中的表示方式一致。
在进行按位运算之前,您应该了解小端和大端表示。
在 8 位整数上的表达式 (127)|(-127)
在 1's complement or in -1
in 2's complement 中得到 -0
。
按位运算不要使用有符号整数,请使用unsigned
。
这就是警告告诉您的内容。
您没有显示 a
、b
和 c
的类型,因此很难更具体。
在你的代码中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 的编译器)使用。