我有以下代码:
#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
答案 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,
// ...
};