C二元算子& (-1)

时间:2017-03-25 17:40:11

标签: c bitwise-operators

假设你有代码包括:

if(i & (-1)) {}

取决于i,此操作会返回什么?

2 个答案:

答案 0 :(得分:3)

这个问题没有明确的答案:它取决于i的类型,如果操作是在签名类型的域中执行,则取决于给定平台使用的签名表示。

例如,如果i的类型为unsigned int(或更大的无符号类型),则整个操作将在该无符号类型的域中执行。在这种情况下,-1将被隐式转换(通过通常的算术转换)到与i一样宽的全1位模式。整个if实际上将等同于if (i)

但是签名类型为i - 没有办法说出任何肯定的内容。

答案 1 :(得分:1)

对负值执行按位运算的结果是实现定义的。

例如,如果2的补码表示用于否定,则值-1将由所有1位的序列表示,因此使用-1执行按位AND将导致值{{ 1}}。

另一方面,如果使用符号幅度表示,则在值-1中设置仅2位,最高和最低。在这种情况下,只会在结果中设置i的最高位和最低位(在任何转换之后)。

总而言之,如果没有一些确定负值表示的实现定义方法,你就不能依赖于结果。