20

この間ずっと、私はこの質問をすることを考えたことはありません。私はこれがc++から来たことを理解していますが、その背後にある理由は何でしたか:

  • 通常どおりに10進数を指定します
  • 先行0で8進数を指定します
  • 先頭の0xで16進数を指定します

なぜ0?なぜ0x?base-32の自然な進歩はありますか?

4

7 に答える 7

22

C ++とJavaの祖先であるCは、もともと70年代初頭にPDP-8でDennisRichieによって開発されました。これらのマシンには12ビットのアドレス空間があるため、ポインタ(アドレス)は12ビット長で、コードでは4つの3ビット8進数で表すのが最も便利です(最初のアドレス指定可能なワードは0000octal、最後のアドレス指定可能なワードは7777octal)。

各8進数は3ビットを表すため、8進数は8ビットバイトに適切にマップされません。したがって、8進数表記で表現できる余分なビットは常に存在します。全TRUEビットバイト(1111 1111)は、8進数で377ですが、16進数でFFです。

2進数は通常8のブロックで表され(バイトのサイズであるため)、8は正確に2つの16進数であるため、ほとんどの人にとって16進数は頭の中で2進数に変換したり、2進数から変換したりするのが簡単ですが、16進数表記は扱いにくいでしょう。デニスの時代には誤解を招くものでした(16ビットをアドレス指定する機能を意味します)。プログラマーは、ハードウェア(通常、各ビットが物理ワイヤーを表す)を操作する場合、およびビット単位のロジック(各ビットがプログラマー定義の意味を持つ)を操作する場合、バイナリで考える必要があります。

デニスは、毎日の10進数の可能な限り単純なバリエーションとして、0プレフィックスを追加し、それらの初期のパーサーが区別するのが最も簡単だと思います。

16進表記0x__が少し後にCに追加されたと思います。コンパイラはツリーを解析して、1〜9(10進定数の最初の桁)、0(8進定数の最初の[重要でない]桁)、および0x(後続の桁に続く16進定数を示す)を互いに区別します。先頭の0をインジケーターとして使用して、後続の数字を10進数ではなく8進数として解析することから切り替えるよりも複雑です。

デニスがこのように設計したのはなぜですか? 現代のプログラマーは、これらの初期のコンピューターが、CPUのフロントパネルのスイッチを物理的に切り替えるか、パンチカードや紙テープを使用してCPUへの命令を切り替えることによって制御されることが多いことを理解していません。いくつかの手順や指示を保存することで、手作業を大幅に節約できるすべての環境。また、メモリは限られていて高価であるため、いくつかの命令を保存するだけでも大きな価値がありました。

要約すると、8進数の場合は0です。これは、8進数が効率的に解析可能であり、8進数がPDP-8でユーザーフレンドリーだったためです(少なくともアドレス操作の場合)。

16進数の場合は0xです。これは、8進数プレフィックス標準の下位互換性のある自然な拡張であり、解析が比較的効率的であるためと考えられます。

于 2012-12-19T20:28:41.813 に答える
9

8進数のゼロプレフィックスと16進数の0xは、Unixの初期のものです。

8進数が存在する理由は、6ビットバイトのハードウェアがあったときにさかのぼります。これにより、8進数が自然な選択になりました。各8進数は3ビットを表すため、6ビットバイトは2つの8進数です。同じことが8ビットバイトからの16進数にも当てはまります。ここで、16進数は4ビットであり、したがって1バイトは2桁の16進数です。8ビットバイトに8進数を使用するには、3つの8進数が必要です。そのうち、最初の桁は0、1、2、および3の値しか持てません(最初の桁は実際には「4進数」であり、8進数ではありません)。バイトが10ビット長であるシステムを誰かが開発しない限り、base32に移行する理由はありません。したがって、10ビットバイトは2つの5ビット「ニブル」として表すことができます。

于 2009-12-02T20:40:44.380 に答える
5

「新しい」数字は、既存の構文で機能するために、数字で始まる必要がありました。

確立された慣習では、文字(または他のいくつかの記号、おそらくアンダースコアまたはドル記号)で始まる変数名およびその他の識別子がありました。したがって、「a」、「abc」、および「a04」はすべて名前です。数字は数字で始まります。したがって、「3」と「3e5」は数字です。

プログラミング言語に新しいものを追加するときは、それらを既存の構文、文法、およびセマンティクスに適合させようとし、既存のコードが機能し続けるようにします。したがって、構文を変更して、「x34」を16進数にしたり、「o34」を8進数にしたりすることは望ましくありません。

では、この構文に8進数をどのように適合させますか?「0」を除いて、「0」で始まる数字は必要ないことに気付いた人がいます。123の場合は「0123」と書く必要はありません。そのため、8進数を表すために先行ゼロを使用します。

16進数はどうですか?「34x」は3416を意味するように、接尾辞を使用できます。ただし、パーサーは、数字の解釈方法を知る前に、数字の最後まで読み取る必要があります(ただし、「a」から「f」の数字のいずれかに遭遇した場合は、もちろん16進数を示します)。数字が16進数であることを早い段階で知ることは、パーサーで「簡単」です。ただし、それでも数字から始める必要があり、ゼロトリックはすでに使用されているため、別のものが必要です。「x」が選択され、16進数の「0x」が追加されました。

(上記は、コンパイラー開発者または言語委員会によって行われた特定の決定の知識ではなく、構文解析の理解と言語開発に関するいくつかの一般的な歴史に基づいています。)

于 2012-11-05T15:19:14.807 に答える
4

私は知らないよ ...

0は0ctalの場合

0xは、8進数を意味するためにすでに0を使用しており、16進数のxがあるので、そこにも

自然な進行については、次のような添え字を付けることができる最新のプログラミング言語をよく見てください。

123_27(_を下付き文字を意味すると解釈)

等々

マーク

于 2009-12-02T20:30:45.987 に答える
2

base-32の自然な進歩はありますか?

これは、Adaが16#の形式を使用して16進定数、8#を8進数、2#を2進数などを導入する理由の一部です。

でも、ベースに「将来の成長」のためのスペースが必要になることについては、あまり気にしません。これは、世代ごとに桁違いに必要なRAMやアドレス空間とは異なります。

実際、調査によると、8進数と16進数は、バイナリ互換の人間が読める形式の表現のスイートスポットです。8進数よりも低くすると、大きな数字を表すために、とんでもない数字が必要になります。ヘックスより高くなると、数学のテーブルが途方もなく大きくなります。16進数は実際にはもう少し多すぎますが、8進数には1バイトに均等に収まらないという問題があります。

于 2009-12-03T15:56:35.460 に答える
1

Base32には標準のエンコーディングがあります。Base64と非常によく似ています。しかし、読むのはあまり便利ではありません。2つの16進数を使用して1つの8ビットバイトを表すことができるため、16進数が使用されます。また、8進数は、主に12ビットバイトを使用する古いシステムに使用されていました。生のレジスタをバイナリとして表示する場合と比較して、データの表現がよりコンパクトになりました。

一部の言語では、8進数にo ###、16進数にx##またはh##、およびその他の多くのバリエーションが使用されていることにも注意してください。

于 2009-12-03T16:05:24.717 に答える
-1

0xそれは実際にはUNIX/Linuxの世界で発生し、C /C++や他の言語で採用されたと思います。しかし、正確な理由や本当の起源はわかりません。

于 2009-12-02T20:30:00.810 に答える