質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • アーキテクチャ

    91questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • CPU

    54questions

何故、CPUのbit数は、8の倍数で2のべき乗なのか

受付中

回答 6

投稿

  • 評価
  • クリップ 4
  • VIEW 1,874

aaaaaaaa

score 471

PCのCPUのBIT数は、8bit、16bit、32bit、64bitと8の倍数かつ、2のべき乗ですが、これはなぜですか。
こちらのサイトによれば、

ようやく本題:CPU の語長が2の冪乗だと,具体的に何が都合がいいのか?
私の (プログラマとしての) 経験から具体的なメリットを挙げてみる.
(実際にそういう語長が出現 ~普及した経緯についてはコンピュータ史を色々調べてみる必要がある.昔からそうしたいと思っているのだが….)

なぜ8ビットの倍数でなければならないか?
標準的な文字コードとして ASCII (7ビット) が普及した. その後制定された各国のさまざまな文字コードも最低7ビットが必要で, 普通は8ビットを単位としている. したがって1バイト=8ビット単位でデータを処理するマシン (バイトマシン ) でないと,文字情報を効率良く扱えない.

なぜ語長が2の冪乗でなければならないか?
プログラムを書いていると,あるサイズ (ビット数またはバイト数) のデータを記憶するのにメモリが何語 (または何バイト) 必要か, といった計算をしなければならないことがしょっちゅうある (プログラマが意識していなくて,コンパイラがやっている場合も多い). これを次のようなたとえ話で考えてみよう.

「N個の同種の品物 (ビット) がある.1つの箱 (語またはバイト) にはM個の品物が入れられる.いくつの箱が必要か?」
例えばN=789個の品物があったとして,1箱にM=12個入るとすれば, N÷M=65あまり9なので66箱必要ということになる. しかし割り算を筆算でするのは手間がかかる. (コンピュータは自分で計算しなければならないので, このたとえ話で「電卓を使う」というのはナシ.)

人間は10進数で計算するので,Mが10の冪乗 (10,100,1000,…) だったらわざわざ筆算しなくても, 小数点の位置をずらすだけで簡単に答えが出る.

コンピュータは10進数ではなく2進数を使うので, 語という「箱」やバイトという「小箱」の大きさが2の冪乗ならば, わざわざ時間のかかる割り算をしなくても,(小数点の代わりに) ビットの位置をずらす (シフト) だけですぐに答えが出るので,処理が高速に行える. プログラムの中ではこういう計算を頻繁に行うので, 語やバイトが2の冪乗でないと,処理が非常に遅くなる場合がある.

(最近のパソコンに使われている CPU は,乗除算を高速に行う回路を持っている. しかし家電製品などに組み込まれている CPU は,低価格化, 低消費電力化などのためにそういう回路は付いていないことが多いので, 乗除算には時間がかかる.)

とありました。
7bitで文字を表現するASCIIが普及して、プログラミングを行う上でよく行う計算は、ビットをずらしたほうが速いから、CPUのbit数は、8の倍数で2のべき乗ということなのでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+3

この件を語る時に、最初に触れておくべき話として、そもそも何の bit 数をもって「××bitCPU」と言うのか、という話があります。

一般的には「その CPU が持つ最長のアドレスレジスタの bit 数」なのだと聞いたことがありますが、モノによって解釈が違う bit 数を自称していることがそれなりにあるので、実は明確な定義はないと言ってよい状況です。「レジスタ同士の演算器のうち最長の bit 数のものの bit 数」だとか、「命令長」とか、他の何かだったりします。

昔は、アドレスレジスタとデータレジスタの長さを別にすると、それぞれ用に演算器を分けて作る必要が出てくるため、このあたりは統一されていることが多く、定義が曖昧でもあまり困らなかったのですが、最近はそのコストよりも別のコストの方を重視するようになってきたため、カオスなことになってきているのが実情で、この縛り自体もだいぶ緩いものとなってきています。

以上を踏まえた上で本題ですが、まず、他の回答ですでに触れられている通り、8bitCPU の前に 4bitCPU がありましたので、この件は、「4 の倍数かつ、2 のべき乗」というのが正しい話になります。

ではなぜ 4 の倍数なのかと言えば、電卓を発祥とする関係もあり、10 進数表現が必要だったからです。計算結果を10進数表記で出力する際に、4bitで10進数の1桁分を表すBCD 表現 / 表記等に変換してから出力することで処理が楽になるわけですね。他にも、小数点以下の部分の数を扱う場合に、2 進数のまま計算していると10進数への変換時に結構な誤差が発生してしまって都合が悪い問題への対応としてもBCD表記が使われています。

そして、なぜ 2 のべき乗なのかと言えば、回路設計の都合です。CPU というのは大規模な回路であり、その設計にはパターン化による省力化が必須です。パターン化することで設計負荷を下げ、デバッグなどのコストを抑えることができます。

そのパターン化の中で、同じ回路を 2個並列に並べて上位 bit と下位 bit に分けて処理しておいて、後でうまいことつなぎ合わせるようなことができるパターンがあるため、単純に倍にした方が半端にbit数を伸ばした回路を作るより簡単だし、過去に頑張ってデバッグ&最適化してきた回路(パターン)をそのまま使い回すこともできてさらに効率がよくなるというわけです。

そんなわけで、倍に、倍に、となってきた結果、「4の倍数かつ2のべき乗」が主流となってきた、という話なのですが、64bitより上については、さまざまな事情からこの法則を外れる可能性が高いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

36bitのCPUも存在します。NEC製のACOS-6です。
Intelの初期の計算専用のprocessor,  8087 は、80bitです。
「なぜ?」に対する答えは、16,32,64 の場合は、それぞれの前世代の8,16,32の計算機の命令等を2つ並べることができたから。16の次が24じゃパンチないし、48が欲しいという需要もない。32と言えば作る側のみんなが納得する。それほどすごい利点はありません。
また計算は2^n x 8 でも、最大のメモリの容量はそうとは限りません。今の計算機で、32bitのアドレス空間 = 4GByteよりも大きいのが普通でも、64bit のアドレス空間分の物理的なメモリを持つ計算機は存在せず、i9-7890でも最大128G = 37bitアドレス空間にすぎません。

9bitでも、7bit でも計算はできるし、ハードを作るときにも、7<->8, 8<->9間にそれほど大きな差はありません。宇宙人が多種類存在すれば、on/offの2値ではなく、初めから3値持てる計算エレメント使って発達した文明というもあると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

この問題は2つに別れますね。
1.なぜ1バイト8ビットが主流なのか
2.なぜ処理単位(CPUの主たるレジスタの語長)は2のべき乗バイトなのか

2については、まだよく検証できてませんが、バイトマシン(メモリアドレスが、CPUの処理単位と関係なくバイト単位でついているアーキテクチャ)の場合は、処理単位が2のべき乗バイトでないと効率の良いメモリアクセスができないという事ではないかと思っています。

なお、引用ページの、

したがって1バイト=8ビット単位でデータを処理するマシン (バイトマシン ) でないと,

というバイトマシンの説明は間違っています。まあ、この括弧内を削除しても意味が通じるので、全体の文意には関係ありませんが。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/01 20:43

    直接、関係ないかも知れませんが、昔のメモリは、x1が多かったと思う( PCだけか?) 従って、8bitアクセスのためには、8個単位で、メモリチップを増設する必要があった。 また、その昔は、CPUもチップではなく、CPUボードでした。(この世界では、1bit増やす事は、コストに直反映)

    キャンセル

0

お示しの「こちらのサイト」の文章は非常によくまとまっており内容も正しいと思いますが、その上で何が疑問なのでしょうか。
あなたの要約が適切か否かというのが質問であれば、国語の問題であってプログラミングに関係のない質問と判断いたします。

他に理由として考えられることとしては、ワード(語)内のビット位置を指定する機械語命令はよくあるのでワード長が2の冪乗だと無駄が無くて気持ちがいいです。
メモリ上に並べる話は、アドレスはバイト単位やワード単位で振られるのが普通なので1バイトが8bitである理由にはならないんではないかなと思います。
PICが12ビットというのも、1ワードが12ビットで構成されていてワード単位でのアドレスが振られている実例です。
PICはハーバードアーキテクチャといってデータメモリとプログラムメモリが分離されているためにこの中途半端なワード長でも問題がありません。

他に中途半端なビット長のCPUを作る理由として挙げられるのが、16bit CPUでのアドレス64KBが微妙に手狭になったけれど32bitというのも長すぎる、という状況ですね。
これでMSP430の一部が20bit CPUになっています。(MSP430X 20-bit extensionと呼ばれる模様)
見るとやたらと面倒そうな仕様になっていて、逆説的にビット幅を2の冪乗にしたい理由が理解できて楽しいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/01 13:22

    > MSP430の一部が20bit CPUになっています
    これのことでしょうか
    http://www.ti.com/lit/ug/slau391f/slau391f.pdf
    "MSP430X 16-bit RISC CPU (CPUX)"と記されていますね・・・

    キャンセル

  • 2018/09/01 20:29

    それですね。そうですか自称は16bitでしたか。
    CPUのビット数の定義は曖昧ですからね。
    20bitのレジスタ同士の演算命令があれば20bit CPUと呼びたいんですけど。

    キャンセル

  • 2018/09/01 20:38

    確か、通信系では、バイト=8bitと決め打ちできないという事で、オクテット表記を使うと聞きます。ワードはもっと怪しく、16bitと 32bitの混在。
    昔、使ったコンピュータは、ワードアドレスとバイトアドレスが別で、注意する必要があった。

    キャンセル

-2

情報処理理論で習いましたが、10進数を効率よく表現できるのが3進数だそうです。でも、数学的に表現するのが効率が良いのが2進数だそうですよ。確か、Sで始まるなんとかの理論があったはずです。もう30年も前に習ったことなので大半は忘れてしまいました。たぶん低評価を入れられると覚悟して書いてます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/30 22:50

    「10進数を」じゃなくて、「数値を」でしょう。3が自然対数の底に一番近いからですね

    キャンセル

  • 2018/08/30 22:52

    どっかに書いてあるかなと、
    https://ja.wikipedia.org/wiki/%E4%B8%89%E9%80%B2%E6%B3%95
    を見てみると、前提が間違っているのでは?と書いてありました。

    キャンセル

  • 2018/08/30 22:54

    「自然対数の底に一番近い」そうです! 思い出しました。でも、数値というと普通に使われてる12進数や60進数が入ってしまうのでは?

    キャンセル

  • 2018/08/30 22:56

    平衡三進法を使ったコンピュータですか。そんなモノがあったとは。昔はアナログコンピュータというのが学校にあって……

    キャンセル

  • キャンセル

  • 2019/04/08 22:18

    > 数値というと普通に使われてる12進数や60進数が入ってしまうのでは?
    入りますよ。N進数というのは、数値を物理的に表現する方法なので、何進数かは別にどうでも良いです。

    キャンセル

-3

CPUは、膨大な数の、AND,OR,NOTの回路で、構成されています。
その中で、AND,ORは、二入力、一出力の、最小の演算機です。

二入力を、二つ並べると、四入力、
四入力を、二つ並べると、八入力、

というように、0,1で、処理を行うCPUは、必然的に、2のべき乗で作る事となります。

また、8ビットの前には、intel4004といった、4ビットCPUが、存在しており、
4,8,16,32,64 bit
と、進化してきました。

では、2ビットは?、、、
AND,OR,etc
の、基礎素子で扱えるし、そもそも2ビットでは、計算も、ままならないかと。

そう、最近のマイコンの世界では、12ビット(PICマイコンとか)などもあります。

なお、7bitの話は、ソフト面での色が強く、あまりハードの進化には影響していないと、思います。まあ昔はハードで7bitデコードしていた機器も、あったようですが。

では!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/21 19:50

    その昔は、6bitもあった筈。理由は簡単。コストです。
    当初は、ソフト面より、ハードの都合が優先されていました。
    その後、ハード的な余裕から、6bit, 7bitは淘汰されたと思います。

    キャンセル

  • 2018/08/28 12:21 編集

    > 最近のマイコンの世界では、12ビット(PICマイコンとか)などもあります

    12bitのPICとは、具体的にどの製品を指しているのでしょうか。PICはRISC構造ですが、その命令長が12bitである製品は確かに存在します。それについておっしゃっているのでしょうか?12bitの命令長を持つものにはPIC12シリーズなどがありますが、その演算器は8bit幅です。PICのメーカーであるMicrochip Technology社でも、演算器が8bit幅のものは8bit MPUとしてラインナップされています。CPUのビット数はどこに注目するかで多様な主張ができる曖昧なものではありますが、このご回答では論理回路に注目しているものと思います。一方では回路構造、他方では命令長では、一貫性が無いのではないかと思います。

    キャンセル

  • 2018/08/30 21:34

    全体的に質問への答えになっていないので低評価しました。
    とくに、
    > 二入力を、二つ並べると、四入力、
    > 四入力を、二つ並べると、八入力、
    というのはそれがなんだというのか分かりません。
    3入力を2つ並べれば6入力、3つ並べれば9入力です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • アーキテクチャ

    91questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • CPU

    54questions