假设你有代码包括:
if(i & (-1)) {}
取决于i
,此操作会返回什么?
答案 0 :(得分:3)
这个问题没有明确的答案:它取决于i
的类型,如果操作是在签名类型的域中执行,则取决于给定平台使用的签名表示。
例如,如果i
的类型为unsigned int
(或更大的无符号类型),则整个操作将在该无符号类型的域中执行。在这种情况下,-1
将被隐式转换(通过通常的算术转换)到与i
一样宽的全1位模式。整个if
实际上将等同于if (i)
。
但是签名类型为i
- 没有办法说出任何肯定的内容。
答案 1 :(得分:1)
对负值执行按位运算的结果是实现定义的。
例如,如果2的补码表示用于否定,则值-1将由所有1位的序列表示,因此使用-1执行按位AND将导致值{{ 1}}。
另一方面,如果使用符号幅度表示,则在值-1中设置仅2位,最高和最低。在这种情况下,只会在结果中设置i
的最高位和最低位(在任何转换之后)。
总而言之,如果没有一些确定负值表示的实现定义方法,你就不能依赖于结果。