質問

私は次のようなマクロを持っています:

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

次のコードを呼び出す場合:

Foo('1') => 16

ただし、次のコードを呼び出す場合:

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

だから私の質問は、ここで何が起こっているのかということです。どして x & 070 に計算します x しかし x & 70 0に計算しますか?

私の推測では、左側の余分な0は、1ではなく60バイトをかけることを強制されていると思います。その場合、ビットワイズと次のようになりませんか?

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 

準備 070 とともに 0 あなたがやっているように、コンパイラに、小数ではなくOctalと解釈するように伝えます。あなたはおそらく言いたいです 70.

他の人が言ったように、 070 オクタルです(そして 0x70 16進数)定数。これがあなたの問題があるところです。

ただし、使用する必要があることを追加したい inline マクロの代わりに関数:

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

C ++は、多くのことに対してプリプロセッサを取り除くことができるように多くのことをしました。それなしでできるなら、そうしてください。
(そして、それを使用する場合、少なくともマクロをすべてuppercaseにするために後でコードに対処しなければならない人に慈悲を持っています。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top