誰もがビル・ゴスパーのこのジョークを聞いたことがあるでしょう:
特定のプログラミング言語がマシンに依存しないという神話は、2 のべき乗の合計を計算することで簡単に破綻します。
- 結果が period = 1 with sign + でループする場合は、符号 - マグニチュード マシンを使用しています。
- 結果が period = 1 at -1 でループする場合は、2 の補数のマシンを使用しています。
- 結果が先頭を含めて周期 > 1 でループする場合は、1 の補数のマシンを使用しています。
- 結果が周期 > 1 でループし、先頭を含まない場合、マシンはバイナリではありません。パターンは基数を示しているはずです。
- メモリが不足している場合は、文字列または Bignum システムを使用しています。
- 算術オーバーフローが致命的なエラーである場合、読み取り専用のファシスト豚がマシンの独立性を強化しようとしています。しかし、オーバーフローをトラップする能力はマシンに依存します。
この戦略によって、宇宙、より正確には代数を考えてみましょう。
X = 2 の累乗の和 = ...111111
X を自分自身に追加します。
X + X = ...111110
したがって、2X = X - 1 したがって、X = -1
したがって、代数は 2 の補数であるマシン (宇宙) 上で実行されます。
他の部分は理解できたと思いますが、補数の部分で行き詰まっています。3 ビットと 1 符号ビットの単純な例を考えてみましょう。
bignum および非バイナリ アーキテクチャの動作は明確です。
結果が period = 1 with sign + でループする場合は、符号 - マグニチュードマシンを使用しています。
2 のべき乗が符号ビットにオーバーフローすると、負のゼロになるので、追加しても何も変わりません。次の反復では、完全に脱落し、 にとどまり、正のゼロを何度も追加しMAXINT
ます。
例:
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -0 ||0|111|| +7 |
|0|000|| +0 ||0|111|| +7 |
|0|000|| +0 ||0|111|| +7 |
...
これは確かに、期間 1 と正の値のループです。
結果が period = 1 at -1 でループする場合は、2 の補数のマシンを使用しています。
2 のべき乗が符号ビットにオーバーフローすると、表現可能な最小の整数が生成されます。それを追加する
例:
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -8 ||1|111|| -1 |
|0|000|| +0 ||1|111|| -1 |
|0|000|| +0 ||1|111|| -1 |
...
案の定、-1 でループします。
結果が先頭を含めて周期 > 1 でループする場合は、1の補数のマシンを使用しています。
それは、わかりません。私はそれが行くべきだと思います:
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -7 ||1|111|| -0 |
|0|000|| +0 ||1|111|| -0 |
|0|000|| +0 ||1|111|| -0 |
...
特に、1 より大きい周期でループする方法がわかりません。これは、2 のべき乗が左シフトによって単純に生成されないことを意味します (そうしないと、最終的に単一の 1 ビットが落ちます)。しかし、それらはどのように計算されますか?