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

Foo(x) ((x - '!') & 070)

如果我调用以下代码:

Foo('1') => 16

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

(('1' - '!') & 70) => 0

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

我的猜测是,左侧的额外0迫使60次获得2个字节而不是1。

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
有帮助吗?

解决方案

在C ++中,带有领先的常数 0 是一个八进制常数,而不是小数长。它仍然是整数常数,但是 070 == 56.

这是行为差异的原因。

其他提示

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

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 

准备 0700 就像您正在这样做一样,告诉编译器将其解释为八分之一,而不是十进制。你可能想说 70.

正如其他人所说的 070 是八分之一(并且 0x70 十六进制)常数,这是您的问题所在。

不过,我想补充一点,您应该使用 inline 功能而不是宏:

inline int Foo(int x) { return (x - '!' & 070); }

C ++已经做了很多事情,使我们能够摆脱许多事情,因为这是不良,行为不当和危险的。如果可以的话,请这样做。
(如果您使用它,至少对那些以后必须处理代码的人有怜悯。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top