C++ 为什么按位AND运算16&017会产生意外的结果?

C++ 为什么按位AND运算16&017会产生意外的结果?,c++,bit-manipulation,C++,Bit Manipulation,我有以下代码: #include <iostream> using namespace std; int main() { int val = 16; printf("%d\t%d\t",val,val & 017); return 0; } 而不是 16 16 正如我对布尔运算的期望 16 AND 17 = 16 文字017被解释为八进制表示,因为它以0开头。有关这方面的详细信息,请参见,例如。现在请注意 (17)_8 == (15)_

我有以下代码:

#include <iostream>
using namespace std;

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

    return 0;
}
而不是

16   16
正如我对布尔运算的期望

16 AND 17 = 16
文字017被解释为八进制表示,因为它以0开头。有关这方面的详细信息,请参见,例如。现在请注意

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

然后使用16_10==10000_2,结果就很清楚了。

正如其他人指出的,问题是,数字文本中的前导零将被编译器解释为基数为8的八进制数

017实际上将以十进制为基数呈现为15,因此以十进制为16,15==0

我经常看到这样的失败,当人们试图对数字声明进行格式化时,比如

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

017是我多年来一直在位级编程,我建议在进行位操作时使用十六进制数。例如,您将习惯于识别哪个十六进制数是哪个位模式0xC=0b1100,并且十六进制数总是4位一个数。对于十进制数,我很难知道384的位模式是什么。。。虽然0x180很简单,但至少c++14也支持二进制文字。
enum Values {
    A = 0001,
    B = 0008,
    C = 0016,
    // ...
};