質問

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

  • 通常のように小数を指定します
  • 主要な0でオクタル数を指定します
  • 主要な0xで16進数を指定します

なぜ0?なぜ0x?ベース32に自然な進行はありますか?

役に立ちましたか?

解決

C ++とJavaの祖先であるCは、もともと70年代前半にPDP-8でDennis Richieによって開発されました。これらのマシンには 12ビットアドレススペース, 、したがって、ポインター(アドレス)は12ビットの長さで、コードで3つの4ビットオクタル桁で最も便利に表されていました(最初のアドレス可能な単語は000オクタル、最後のアドレス可能な単語777octalです)。

Octalは、各octal桁が3ビットを表すため、8ビットバイトにうまくマッピングされないため、OCTAL表記では常に過剰なビットが表現できます。全面的なビットバイト(1111 1111)はOctalで377ですが、hexではffです。

ヘックスは、バイナリ数が通常8のブロックで表現されるため(バイトのサイズであるため)、8つはヘックス数字がちょうど2つの桁であるため、ほとんどの人が頭のバイナリとの間で変換するのが簡単ですが、ヘックス表記は不機嫌でしたデニスの時代に誤解を招く(16ビットに対処する能力を暗示する)。プログラマーは、ハードウェア(各ビットが通常物理ワイヤーを表す)を使用するとき、およびビットワイズロジック(各ビットにプログラマー定義の意味がある)を使用するときに、バイナリで考える必要があります。

Dennisは、日常の小数点の最も単純なバリエーションとして0の接頭辞を追加し、それらの初期のパーサーが区別するのが最も簡単であると思います。

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

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

要約すると、OCTALの場合は0が効率的に断片化可能であり、OctalはPDP-8でユーザーフレンドリーでした(少なくとも住所操作の場合)

HEXの場合は、おそらくOCTALプレフィックス標準の自然で後方互換の拡張であり、解析するのに比較的効率的だったためです。

他のヒント

Octalのゼロプレフィックス、16進体の0倍は、UNIXの初期の頃からです。

Octalの存在の理由は、6ビットバイトのハードウェアがあったときに日付を記録し、Octalが自然な選択になりました。各オクタル桁は3ビットを表しているため、6ビットバイトは2オクタル桁です。同じことが8ビットのバイトからの160個でも同じことが言えます。ここでは、16進数が4ビットであるため、バイトは2ヘクス桁です。 8ビットバイトでOctalを使用するには3オクタル桁が必要であり、そのうち最初の桁は0、1、2、および3のみを持つことができます(最初の数字は実際には「Tetral」であり、Octalではなく)。誰かがバイトが10ビットの長さであるシステムを開発しない限り、Base32に行く理由はありません。したがって、10ビットバイトを2つの5ビット「ナイブル」として表現できます。

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

確立されたプラクティスには、文字(または他のいくつかのシンボル、おそらくアンダースコアまたはドルサイン)から始まる変数名とその他の識別子がありました。したがって、「A」、「ABC」、および「A04」はすべて名前です。数字は数字で始まりました。したがって、「3」と「3E5」は数字です。

プログラミング言語に新しいものを追加すると、既存の構文、文法、およびセマンティクスに適合させようとすると、既存のコードが動作し続けるようにします。したがって、「x34」を16進数または「O34」をオクタル数にするために構文を変更したくないでしょう。

それでは、オクタル数字をこの構文にどのように適合させますか?誰かが、「0」を除いて、「0」から始まる数字の必要はないことに気づきました。 123の「0123」を書く必要は誰もいません。したがって、先頭ゼロを使用してオクタル数字を示すものです。

16進数はどうですか?接尾辞を使用できるように、「34x」が34を意味するように16. 。ただし、パーサーは、数字を解釈する方法を知る前に、数字の最後までずっと読み取る必要があります(「A」から「F」数字の1つに遭遇しない限り、これはもちろん16進数を示します)。パーサーでは、数字が六分位であることを知る方が「簡単」です。しかし、あなたはまだ数字から始めなければならないので、ゼロのトリックはすでに使用されているので、何か他のものが必要です。 「X」が選ばれ、今では16進数の「0x」があります。

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

私は知らないよ ...

0は0ctal用です

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

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

123_27(サブスクリプトを意味する_と解釈)

等々

?

マーク

ベース32に自然な進行はありますか?

これは、ADAがフォーム16#を使用してHEX定数を導入する理由の一部です。

しかし、ベースで「将来の成長」のためにスペースを必要としていることにはあまり心配していません。これは、あらゆる世代を数桁必要とするRAMや対処スペースのようなものではありません。

実際、研究では、オクタルとヘックスがほとんどないことが示されています スイートスポット バイナリ互換性のある人間の読み取り可能な表現の場合。 Octalよりも低くなった場合、より多くの数を表すために、幼虫の数字の数字が必要になり始めます。 HEXよりも高く進むと、数学テーブルが再び大きくなります。ヘックスは実際にはすでに少し多すぎますが、オクタルにはバイトに均等に収まらないという問題があります。

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

また、一部の言語では、octalの場合はo ###、hexにはh ##または他の多くのバリエーションを使用することに注意する必要があります。

私はそれを思う 0x 実際にはUnix/Linuxの世界のために来て、C/C ++およびその他の言語によってピックアップされました。しかし、私は正確な理由や真の起源を知りません。

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