为什么按位AND操作16& 017给出了意想不到的结果?

时间:2015-07-09 19:56:38

标签: c++ bit-manipulation

我有以下代码:

#include <iostream>
using namespace std;

int main() {
    int val = 16;
    printf("%d\t%d\t",val,val & 017);

    return 0;
}

为什么输出

16   0

而不是

16   16

正如我所期望的布尔操作

16 AND 17 = 16

2 个答案:

答案 0 :(得分:6)

文字017被解释为八进制表示,因为它以0开头。有关详细信息,请参阅例如here。现在请注意

(17)_8 == (15)_10 == (1111)_2

然后使用(16)_10 == (10000)_2,结果很明确。

答案 1 :(得分:0)

正如其他人指出的那样,问题在于,数字文字中的前导零将由编译器将值解释为基数8(八进制)数。

017实际上会在十进制基数中呈现为15,因此为十进制16 AND 15 == 0

当人们试图“漂亮格式”数字声明时,我已经看到了这种失败,例如

enum Values {
    A = 0001,
    B = 0008,
    C = 0016,
    // ...
};