2016-05-09 21 views
0

には、以下の機能を与えられましたか?私はそれに渡されているものを正確に理解することができません。私がboof(10)を呼び出した場合、それは10を基数2に変換し、2進数のビット単位の演算を行いますか?Cビット演算子の例

これは私が最近クイズで持っていた質問で、答えは0と思われますが、それをどのように証明するかはわかりません。

注:ビット単位の演算子がどのように動作するかは知っていますが、入力がどのように処理されるかはもっと分かりません。

ありがとうございます!

+0

10はコンパイラによってベース2に変換されるので、答えは0です。 –

+0

これは1011 + 0101で1111になります。次に1111 + 0001で1111となります。 –

+0

*最新のコンピュータのすべての*データはバイナリ、つまりベース2に格納されています。何が起きているのかを知るには、紙に渡した番号をバイナリとして書き留めてから、あなたは[2の補完システム](https://en.wikipedia.org/wiki/Two's_complement)を使用しているシステムの可能性が最も高いです。 –

答えて

2

ビット単位の演算では、基数2の基底表現は基底2に変更されません。CPUのすべての演算は、バイナリ演算を使用して行われます。

この関数の機能は、nをとり、それを2の補数の負の表現に追加することです。これは基本的に入力を無効にします。あなたが入れたものはすべて0になります。

これは視覚化しやすいので、8ビットの数値で説明しましょう。

10は、2の補数に格納されて00001010.

負の数(数に注目し、1を加算)

だから(〜N + 1)のようなので10人のルックスのための部分として、バイナリで表されます。

11110101 + 1 = 11110110

だから我々は、n +〜N + 1取る場合:

00001010 + 11110110 = 0

注意我々は一緒にこれらの番号を追加する場合、我々は0(共に負と正の数を追加することはない手段で得られた、オーバーフローフラグをセットする左キャリーを得ますオーバーフローが例外を示します!)nint,のn +〜nは設定されたすべてのビットを有するwill always result in an int`とき

この The CARRY and OVERFLOW flag in Binary Arithmetic

+0

さて、それはクリックされました。説明ありがとう!明日の最終試験で私に運がいいよ:D –

+0

@EmiliaClarke幸運を助けてくれてうれしい! – bodangly

2

を参照してください。

厳密に言えば、そのようなintに1を追加する動作は、プラットフォーム上の符号付き数値の表現によって異なります。 C標準サポートsigned int 3つの表現:設定されたすべてのビットをintが-1であるので、2の補数機用

  • (使用中のシステム今日の大部分は)、結果は0となります。 が0または-0(負のゼロ)または未定義のビヘイビアであるため、結果は1になります。

  • 符号付きマグニチュード機(これらのいずれかがまだ使用中で実際にあるのですか?)、設定されたすべてのビットを有するintが最大の大きさと負の数である(したがって、実際の値はintの大きさに依存するであろう)。この場合、1を加算すると負の数になります(正確な値は、intを表すために使用されるビットの数によって異なります)。

上記は、それがn + ~nで可能であるかもしれない様々なビット構成のトラップにいくつかの実装は可能であるかもしれないことを無視することに留意されたいです。

+0

'n | 〜n 'はすべてのビットをセットすることになりますが、 'n +〜n'は2の補数の場合にのみ行われます –

+0

1の補数のマシンを使用した唯一の時間は大学に戻りました。私の思い出は、ビット反転で数値を加算すると負のゼロ(ほぼすべての目的でゼロと同じように動作した)が得られたことです。すべてのビットが設定されています。標準を見ると、「これらのケースが実際に負のゼロまたは通常のゼロを生成するかどうか、および負のゼロがオブジェクトに格納されたときに通常のゼロになるかどうかは不明です。したがって、どちらの動作もOKです。 –

+0

また、このようなことに対して理論的に起こりうるすべてのニュアンスを正確にカバーすることは、標準の塊をコピー/ペーストするためには本当に沸騰します。私が本当にやろうとしていたことは、技術的に正しい答えが1つもないことを指摘していましたが、探しているものが「ゼロ」であることは間違いありません。 –