C++中的"Bitwise And"和Left-Padding

soh*_*hum 5 c++ ascii bitwise-and

我有一个看起来像这样的宏:

Foo(x) ((x - '!') & 070)
Run Code Online (Sandbox Code Playgroud)

如果我调用以下代码:

Foo('1') => 16
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用以下代码:

(('1' - '!') & 70) => 0
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这里发生了什么?为什么x & 070计算到xx & 70计算到0?

我的猜测是左边的额外0是强制60取2个字节而不是1.在这种情况下,不会按位并且如下所示?

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 12

在C++中,带前导0的常量是八进制常量,而不是十进制常量.它仍然是一个整数常数但是070 == 56.

这是行为差异的原因.


Mic*_*sen 7

不,额外的0表示该数字被读为八进制(基数为8).这意味着它不会说70,而是56:

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 
Run Code Online (Sandbox Code Playgroud)