はじめに
【2022/02/03追記】
Twitterで、1バイトは何ビットかというのが話題に上り、この記事も急に参照されるようになりました。
話題になることで識者の方々から私自身も知らない知識を得ることが出来ました。
最終的には、ITmedia NEWSの大原雄介さんの下記の素晴らしい記事が産まれることになったので良かったです。
1バイトの定義
なぜ、1バイトは8bitになったのだろうという疑問から調べはじめました。
昔は4bitのCPUがあったわけだし、その時も1バイトが8bitなのか4bitではないのか?という疑問がわいたわけです。
結論から書くと当時4bitのCPUの場合、1バイトは4bitだったわけです。
とはいえ、CPUの値がそのまま1バイトになるわけではないです。
1bit CPU はできるのか?によると
長い歴史の中で、CPUのbit長はALU長でもなくアドレスバス長でもなく「レジスタ長とデータバス長のうち短い方」である、という常識が生まれたようです。」
さらに調べていくと、DECの有名なコンピュータ「PDP-11」の前身「PDP-10」があるのですが、1バイトは6bitでした。
PDP-11開発秘話:ミニコンものがたりによると、開発者のケンオルセンの話が以下のようにあります。
その当時必要とされていたデータは6ビットでいろいろな文字コードや制御コードを表現していたんだよ。標準規格で名高いISO、JISのように将来の拡張性などを考慮して8ビットコードが定義されたのは後のことで、実験機器、A-Dコンバータなどは精度が低く6ビットあればよかったんだ。それで、3ビットの整数倍のほうが扱いが簡単だということで、DECでは8進数を用いようと決めたんだ。
基本単位が8bitになった理由
ISO/IEC_80000-13:2008の中で情報系の単位として8bitの塊を1Byteと表現すると定義された。
1Byte=8bitに対する技術的な回答 - ITmedia NEWS
当時文字列は大文字のみで、なので英数記号を全部入れても49文字で済んでいたから、6bit=64文字分があれば収まった。ところが小文字まで入れると64文字では収まらないことになる。
1960年代、IBMのメインフレームを使うアプリケーションの75%が数値データであったそうだ。数値といっても、例えば金融系だとどうしても2進演算のままでは丸め誤差とかが10進の場合と異なってしまう。このため、4bitで10進の一桁を扱うBCD(Binary-Coded Decimal)というデータフォーマットが使われていた。
これを6bitベースのマシンで扱うということは、12bitで3桁、24bitで6桁になって効率が悪い。8bitにすれば1Byteで2桁の数字を同時に扱えることになり、効率が上がるわけだ。文字列の問題もさることながら、商用の数値演算用途を考えた場合、6bitより8bitの方が効率が良い。
1Byte=8bitになったのはSystem/360がそうしたから? - ITmedia NEWS
下記以降は、別説とする。
処理する文字が英語の大文字小文字や特殊記号など増えてくるのに従って、6ビットでは足りなくなってきました。英語大文字+英語小文字+数字を表現するだけで26+26+10=62パターン必要です。62パターンを表現するには、6ビット必要となります。さらに、プラスやマイナス等の特殊記号を表現させるために、最低でも7ビット必要となります。ASCII文字コード
7bitで1バイトでも良いのですが、通信用のパリティビットを表現させたりするために、プラス1ビットを追加した8ビットが1バイトとなりました。
パリティビットとは最も単純な誤り検出符号でビット列中に含まれる「1」の個数が奇数個ならパリティビットを「1」に偶数個なら「0」にする方式です。
再考、1バイトは何ビットか?-宜しければTTLでコンピュータを作りませんか? では
基本的なビット数が奇数だと、それを丁度半分ずつに分けて使うことができません。このため基本的なビット数を奇数にする事は嫌われ6か8を基本単位にするという考え方が「消去法」で残ることになりました。
一般化から正式に統一へ
IBMが1964年に発表した8を基本的なビット数とした計算機(System360)が大ヒットしたのに対し、6を基本的なビット数とした計算機は1966年のDEC PDP-10程度だったため、徐々に「1バイトが8ビット以外の計算機」を知らない者が増えたのです。更に1974年、インテルが発表した8080が大ヒットした事も加わり、いつの間にか8を基本的なビット数とした計算機だらけとなり、1バイト8bitが一般化されていたわけです。
しかし、1970年代では「1バイトは8bitとしましょう」としても、まだ多くの反対者がいたようです。
それから30年以上たった2008年にISO(国際標準化機構)やIEC(国際電気標準会議)が「1バイトは8bitとしましょう」という意見がついに採択されたのです。
結構、最近なんですよね。はてなブックマーク:1バイトの都市伝説
【追記】
NECのメインフレームワークである「ACOS-6」は、数少ないワードマシン(1ワード=36ビット)で、1バイト=9ビットで処理をしていた。
2009年03月にNEC芝クラブにてACOS-6の終焉会が行われたとのことで、かなり近年まで使われていたようです。30年以上かかったのはNECがACOS-6をずっと使い続けていたからかも知れませんね。
注意
C/C++の言語規格では1 バイトは8bit以上となっている。
[迷信] 1 バイトは 8 ビット と 1バイトのビット数の標準規格知りませんか?によると、
C/C++の言語規格では、1 バイトが 8 ビットだという定義はどこにもありません。定義されているのは、char 型のサイズが 1 バイトだということです。そして、char 型のビット数は、CHAR_BIT マクロで定義されます。
CHAR_BIT マクロは、 ヘッダで定義されるマクロで、少なくとも 8 以上に定義されることが保証されています。すなわち、1 バイトが 9 ビットであったり、16 ビットであったり、64 ビットであったとしても、規格上は何ら問題ありませんし、そうした処理系が実際に存在します。
ksmakoto氏からコメントを頂きました。【2017/09/10追記】
C言語のcharについては、サイズだけでなくて値の範囲(SCHAR_MIN, SCHAR_MAX, UCHAR_MAX)がある関係で、標準に沿うならば8ビットより短くはできない、という注釈も必要そうです
NECのメインフレーム「ACOS-6」は36ビットワードマシンで1バイトが9ビットとなっているため、charも9ビット長となっている。
【2017/09/10追記】
ACOS6の場合、36ビットを6ビット6個に分割して6ビットで1文字を表したり、9ビット4個に分割して9ビットで1文字を表したりしています。今は1文字7ビット以上の文字エンコーディングが普通ですから、9ビット×4個が一般的に使われているようです。つまり「1バイト = 9ビット」ということになります。そして、この場合、1バイトで512個(9bit)の値を表すことができます。
その為、Unicodeを9ビット文字で表現できるように「UTF-9(RFC)」が定義されている。
※すみません、UTF-9(RFC)のRFCの公開日は2005(平成17)年4月1日でジョークRFCでした。
ワードマシンとキャラクターマシンとバイトマシン
【2017/08/19追記】
Twitterでコメントを頂いて、ワードマシンとバイトマシンについて私の方の理解ができていませんでしたので、今回調べました。
何ビットを1組の単位としてデー タ処理を行なうかによるが一般に「ワード」、「キャラクタ」、「バイト」と呼ばれていた。現行のコンピューターはバイトマシンですが、黎明期のコンピューターにはワードマシン、キャラクタマシンがあり、使用する分野ごとに設計が違うのが通常で、主に科学技術計算用(ワードマシン)と事務処理用(キャラクタマシン)に分かれていた。
ワードマシン
科学技術計算用は40ビット前後のワード長のワードアドレッシングで、ワード単位の演算を得意とするワードマシンであった。ワードとは通常9ビット以上のものをいいワードを構成するビット数は機種によって異なり、代表的なワードマシンにEDSACは17bit、IBMの70xシリーズや70xxシリーズは36bit、DECのPDP-7は18bit、PDP-8は12bit、UNIVAC 1000は24bitなどがある。
演算が固定長でなされるので一般に固定語長マシンともいわれる。
ワード内ではオペレーションコードとアドレスが一緒になっている。ワードマシン上でのバイトとは固定ビット数の連続の並びのことで、多くでは6ビットまた7ビットや9ビットとして扱っていた。上述のDECの「PDP-10」が1バイトが6bitとはワードマシン上のバイトのことである。
※ワードマシンは、1ワードに対してアドレスが振られていて、原則として、そのワードを単位として処理を行います。しかし、7ビットや8ビットで1文字を表す場合、それよりずっとビット数の多いワードを単位とした処理が原則のワードマシンでは非効率です。そこでワードマシンでも1バイトを単位とした処理もできるようになっているのが一般的です。
※本来バイトとは、欧文文字1字分の文字コードを表現するために用いるビット数のことをいい、扱う文字種や、あるいはワードサイズをいくつかに分割することによって決められ、その大きさは処理系によって異なる。
ワードマシンでは、18bit、24bit、36bitなど処理ビット数は3の倍数が普通でした。アドレッシングは15ビットでインストラクションを3ビット単位で考えることが多くビット3桁でくくるのが都合がよかった。また、3ビットなら0-7で数字の範囲で処理できるため、解析もしやすかった。
科学技術計算市場向けの初期の多くのコンピューターは36ビットワード長を持っていた。このワード長は、正および負の10進数の10桁を正確に表現する事ができる。コンピュータが登場する前は、精密科学や工学計算での標準的な表現は10桁で行われていたため、これで充分であった。
※36ビットで10桁については、BCD(二進化十進)で4bit表現では9桁(4bit x 9 = 36bit)になる疑問点が残る。
「英語版Wikipediaの 36-bit の記事を見る限りでは、それ以前の十進の機械式などの計算機が10桁だったから、それを超える精度があるよ、という仕様にするために(二進で)36ビットにしたのだ、とあって、それらの(36ビットの)機械が(BCDか何かで)十進10桁だ、とは書かれてないですね……」とのksmakoto氏からコメントを頂いた。
キャラクターマシン
事務処理用は字単位のアドレッシング、4字や6字を1ワードとしたワードアドレッシングで、字単位の処理を得意とするキャラクタマシンであった。日本のメーカではNECの2200シリーズ(ACOSの前進)が大ヒットし、その結果ワードマシンやバイトマシンへの移行を遅らせ、国内シェア1位から転落した。
ワードマシンの固定長と違い、可変長マシンともいわれる。ワードマシンと違い記憶装置を効率的に使用できるが処理単位が1キャラクタであるため処理時間はワードマシンより遅かった。
科学技術計算分野では2進数から10進数の変換による小数の誤差があっても問題にならないが、金額を扱う事務処理用には致命的である。キャラクタを使うことで10進数の文字列に近い形式(BCD)を使い計算に誤差が出ないという特徴があった。
バイトマシン
バイトマシンはキャラクターマシンとワードマシンの両方の特徴をとり入れた方式である。可変語長方式の形式制御の効率のよさや記憶装置の簡表化(経済性)あるいは固定語長方式の演算処理の高速性など両者の特徴を融合させた混合語長方式をとっている。
バイトマシンでは数バイトを1ワードとして扱い、処理に応じてハーフワード、ワード、ダブルワード等の処理方法を行なう。
IBMのメインフレームであるSystem/360によりデファクトスタンダードとなり、以後の大多数のコンピューターはバイトマシンである。
【2018/01/02追記】
当時の日本コンピューター(メインフレーム)について池田敏雄さんの視点で書きました。
日本コンピューター産業の父「池田敏雄」から見る黎明期コンピューターの歩み
8ビットはオクテット
今でこそ1バイト=8bitであるが、昔はバイトが何ビットを表すかは決まっていなかったので、8ビットは「オクテット」と言っていました。通信の世界では曖昧さを排除するために、今でもオクテットが使用されることが多いようです。
「オクテット」と「バイト」は何が違う?
パリティビット含めたビット数
処理の正確さを確保するためパリティビットまたはチェックビットとよばれる1ビットが追加されて、7 + 1ビット(パリティチェックでは8)と8 + 1ビット(パリティチェックでは9)の期間がありました。
最後に
1976年8月のNEC TK-80(8bit)よりも1年近く前に、東芝が日本初のマイコンキットTLCS-12A(12bit)(1973年に発表したTLCS-12の機能・性能改善版)が発売されていたとは知らなかった。これのByteの扱いをどうしていたのかは不明である。