「ビットワイズ」とc ++の左パッディング
-
01-10-2019 - |
質問
私は次のようなマクロを持っています:
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にするために後でコードに対処しなければならない人に慈悲を持っています。)
所属していません StackOverflow