メインコンテンツへスキップ
ブログ一覧に戻る
IT基礎講座 公開

コンピューターはなぜ0と1? 2進数・ビット・バイトを、けたあふれや小数の落とし穴まで|ラクにゃんとミナが解説

ビット2進数バイトIT基礎ラクにゃん
目次(12 章)
ラクにゃんミナ

ラクにゃんとミナ

アイキャッチ
ミナ
ミナ
ラクにゃん、ちょっと聞いてください。会社の回線は「100メガ」のはずなのに、2GBの動画を送ったら、3分近くかかったんです。100メガなら、一瞬じゃないんですか?
ラクにゃん
ラクにゃん
ああ、それはよくある勘ちがいだね。
ミナ
ミナ
それと、もう1つあるんです。新しく買った「1TB」の外付けディスクをつないだら、パソコンには「931GB」って出たんです。70GBも、どこに消えたんでしょう……。
ラクにゃん
ラクにゃん
どっちも、こわれているわけじゃないよ。根っこは同じで、コンピューターが中で使っている「0と1」の数え方にあるんだよ。
ミナ
ミナ
0と1? 写真も動画も、全部0と1だっていう、あの話ですか?
ラクにゃん
ラクにゃん
そう、その話。今日は、なぜ0と1なのかから始めて、2進数の数え方、ビットとバイト、それに、けたが足りなくなったときや、小数を扱うときの落とし穴まで、順番に見ていこうね。最後には、ミナの2つの「なぜ」もすっきりするはずだよ。
「100メガなら一瞬」のはずが、進み具合のバーがなかなか進まない
「100メガなら一瞬」のはずが、進み具合のバーがなかなか進まない
この記事の要点
  1. 1コンピューターが0と1の2つを使うのは、電気が少しゆれても読みまちがえにくく、部品を小さく作りやすいから。10進や3進のコンピューターも作られたが、2進が残った。
  2. 22進数は1けた足すたびに表せる数が2倍になる。8けた(1バイト)で256とおり、32けたで約43億とおり。けたが足りなくなると、メーターが0に戻るように数があふれる。
  3. 3回線の速さはビット、ファイルの大きさはバイトで書く。速さを8で割るとバイトになる。小数は2進数でぴったり書けないことが多いので、お金の計算は丸めてから比べ、システムでは整数で扱う。

1. 中身は、全部0と1

ミナ
ミナ
そもそも、「全部0と1」って、本当なんですか? パソコンの中に、0と1の数字が書いてあるわけじゃないですよね。
ラクにゃん
ラクにゃん
うん、数字が書いてあるわけじゃないよ。部品ごとに、ちがう「2つの状態」を使っていて、それを人が0と1と呼んでいるんだよ。

パソコンやスマホの部品を、のぞいてみましょう。

  • CPU:計算をする部品です。中には、トランジスタという、電気を通すか止めるかを切りかえる小さなスイッチが、何十億個も入っています
  • メインメモリ:作業中のデータを置く部品です。コンデンサーという、電気をためる小さな入れ物に、電気がたまっているか、いないか
  • ハードディスク:円盤の上の小さな磁石が、どちらを向いているか
  • 光ディスク:表面のくぼみで、光がどう跳ね返るか
CPUスイッチ01メモリ電気の入れ物+01HDD磁石の向きNSSN01光ディスクくぼみと光01しくみはばらばら。でも、どれも「2つの状態」のどちらか
CPUスイッチ01メモリ電気の入れ物+01HDD磁石の向きNSSN01光ディスクくぼみと光01しくみはばらばら。でも全部「2つ」
左の状態を 0、右の状態を 1 と呼んでいる
ミナ
ミナ
しくみは全部ちがうのに、どれも「2つのうちどちらか」なんですね。
ラクにゃん
ラクにゃん
そうなんだよ。電気でも、磁石でも、光でも、2つの状態さえ作れれば、0と1を覚えられるね。だから、新しい部品が出てきても、同じ0と1の世界にすっとなじめるんだよ。
ミナ
ミナ
SSDはどうなんですか? 最近のパソコンは、ほとんどSSDですよね。
ラクにゃん
ラクにゃん
SSDは、小さな部屋に電子を閉じ込めて覚えるよ。いちばん素直な作りは「閉じ込めた・閉じ込めていない」の2つ。でも今のSSDの多くは、たくさん入れるために、電子の量を8段階や16段階に分けて、1つの部屋に3ビットや4ビット分を覚えているんだよ。
ミナ
ミナ
え、2つじゃないんですか?
ラクにゃん
ラクにゃん
部屋の中はね。でも、読み出したら、すぐに0と1の並びに直して、ほかの部品とやりとりするよ。それに、段階を細かく分けるほど読みまちがえやすくなるから、SSDは、まちがいを見つけて直すしくみを、たくさん積んでいるんだよ。この「細かく分けると、まちがえやすい」が、次の話につながるんだね。
スイッチを入れると、電球がつく。オフが0、オンが1
スイッチを入れると、電球がつく。オフが0、オンが1

2. なぜ2つ? ゆれと「余白」の話

ミナ
ミナ
でも、ふだん使っている数字は0から9までの10個ですよね。10個使えたほうが、たくさん覚えられそうなのに。
ラクにゃん
ラクにゃん
いいところに気がついたね。では、電気の強さを10段階に分けて、数字を表すことを考えてみよう。

電気の強さは、いつも少しだけゆれています。部品の熱、となりを流れる電気、電源のわずかな変化。完全に止まった、きれいな電気は、ほとんどありません。

10段階に分けると、1段の幅はとても狭くなります。少しゆれただけで、「3」のつもりの電気が「4」の目盛りに入ってしまうかもしれません。

10段階で読む012345678942333 のつもりが、2 や 4 に読まれる2つで読む(0 と 1)01余白(どちらとも決めない)1111同じゆれでも、ずっと 1
10段階で読む012345678932423 のつもりが、2 や 4 に読まれる2つで読む(0 と 1)01余白(どちらとも決めない)1111同じゆれでも、ずっと 1
読む点の数字:その時に読んだ値(緑は正しい・赤はまちがい)。電気のゆれは左右で同じ
ミナ
ミナ
2つなら、多少ゆれても「ある」か「ない」かは、まちがえないんですね。
ラクにゃん
ラクにゃん
そう。しかも、実際の回路では、0と1のあいだに「どちらとも決めない余白」をわざと作っているんだよ。

たとえば、5ボルトで動く、昔からある回路の決まりでは、入ってきた電気が0.8ボルト以下なら0、2ボルト以上なら1と読みます。そのあいだは、どちらとも決めない帯です。0のつもりの電気が少し高めにゆれても、1のつもりの電気が少し低めにゆれても、余白があるので、読みまちがえません。

ミナ
ミナ
わざと、すき間を空けているんですね。
ラクにゃん
ラクにゃん
うん。もう1つ大事なのが、部品の作りやすさだよ。2つでいいなら、トランジスタは「通す・止める」のスイッチとして使うだけで済むね。10段階の電気を正確に作ったり読み分けたりする部品より、ずっと小さく、たくさん、安く作れるんだよ。

まちがえにくくて、作りやすい。この2つが、0と1を選んだ理由です。


3. 10進や3進のコンピューターも、本当にあった

ミナ
ミナ
じゃあ、最初からずっと2進数だったんですか?
ラクにゃん
ラクにゃん
それがね、10進数で動くコンピューターも、3進数で動くコンピューターも、本当に作られたんだよ。

1946年に公開された、アメリカのENIAC(エニアック)は、10進数で計算するコンピューターでした。1けたを表すのに、10個の部品を輪のようにつないで、どこに「しるし」があるかで0〜9を表していました。部品には、電気のスイッチの役をするガラスの管(真空管)を1万8000本ほど使った、部屋いっぱいの機械です。

ENIACを操作する人たち。10進数で計算するコンピューターだった
ENIACを操作する人たち。10進数で計算するコンピューターだった写真:米国陸軍/パブリックドメイン/Wikimedia Commons
ミナ
ミナ
10進数のコンピューター!
ラクにゃん
ラクにゃん
ENIACを作っていた人たちと議論した数学者のフォン・ノイマンは、1945年に、次のコンピューターの設計をまとめた報告書で、2進数を勧めたんだよ。理由は2つ。2つの状態をとる回路がいちばん単純なこと、それに、かけ算や割り算のしくみがずっと単純になることだね。ここから、2進数が広がっていったんだよ。

一方、1958年には、ソ連(今のロシアなど)のモスクワ大学で、3進数のコンピューター「Setun(セトゥニ)」が作られました。−1・0・1の3つの状態を使うもので、50台ほど作られました。でも、工場の事情などで1965年に作られなくなり、まわりの部品や機械もすでに2進数でそろっていたこともあって、広まりませんでした。

ミナ
ミナ
10進も3進も試して、結局2進が残ったんですね。
ラクにゃん
ラクにゃん
そうなんだよ。2進数そのものは、もっとずっと前からあるよ。歩みを見てみよう。
〜1703ライプニッツ2進数の論文1937シャノンスイッチの回路で論理1945フォン・ノイマン報告書で2進数を勧める1946ENIAC10進で計算1948「ビット」という言葉が広まる1956「バイト」という言葉1958Setun3進で計算1964System/3608ビットで1バイト2進数の歩み2進ではない機械8ビットが標準に
1703ライプニッツ2進数の論文1937シャノンスイッチの回路で論理1945フォン・ノイマン報告書で2進数を勧める1946ENIAC10進で計算1948「ビット」という言葉が広まる1956「バイト」という言葉1958Setun3進で計算1964System/3608ビットで1バイト
10 進や 3 進の機械も作られたが、2 進が残った
  • 1703年:ドイツの学者ライプニッツが、0と1だけで数を表す2進数の論文を書きました
  • 1937年:アメリカのクロード・シャノンが、スイッチをつないだ回路で、「AかつB」「AまたはB」のような、正しいかどうかの組み合わせ(論理)を表せることを示しました。0と1の計算を、電気の回路でできることが分かったのです
  • 1948年:シャノンが情報の量を測る論文を出し、0か1の1けたを「ビット」と呼ぶ言葉が広まりました。名前の元は、同僚のジョン・テューキーの提案です
ライプニッツが2進数を説明した論文(1703年)。0と1だけの表が並ぶ
ライプニッツが2進数を説明した論文(1703年)。0と1だけの表が並ぶ画像:ゴットフリート・ヴィルヘルム・ライプニッツ/パブリックドメイン/Wikimedia Commons
クロード・シャノン(1916〜2001年)。スイッチの回路と論理を結びつけ、「ビット」という言葉を広めた
クロード・シャノン(1916〜2001年)。スイッチの回路と論理を結びつけ、「ビット」という言葉を広めた写真:MIT Photo Service/パブリックドメイン/Wikimedia Commons

4. 2進数の数え方

ミナ
ミナ
では、0と1だけで、どうやって大きな数を表すんですか?
ラクにゃん
ラクにゃん
ふだんの10進数から考えるとわかりやすいよ。車の走行距離のメーターを思い出してみて。

10進数のメーターは、いちばん右のけたが0、1、2……と進み、9の次で0に戻って、となりのけたが1つ進みます。これが「繰り上がり」です。

2進数のメーターは、使える数字が0と1だけです。だから、0、1と進んだら、もう次で0に戻って、となりが1つ進みます。

8のけた4のけた2のけた1のけた0000= 00001= 10010= 2繰り上がり!0011= 30100= 4繰り上がり!0101= 50110= 6繰り上がり!0111= 71000= 8繰り上がり!1001= 91010= 10繰り上がり!1011= 111100= 12繰り上がり!1101= 131110= 14繰り上がり!1111= 15
8のけた4のけた2のけた1のけた0000= 00001= 10010= 2繰り上がり!0011= 30100= 4繰り上がり!0101= 50110= 6繰り上がり!0111= 71000= 8繰り上がり!1001= 91010= 10繰り上がり!1011= 111100= 12繰り上がり!1101= 131110= 14繰り上がり!1111= 15
黄色の枠:いま変わったけた。1 の次は 0 に戻って、となりが進む
10進数2進数
00
11
210
311
4100
5101
6110
7111
81000
ミナ
ミナ
「10」が2で、「100」が4……。けたの重さがちがうんですね。
ラクにゃん
ラクにゃん
そのとおり。10進数のけたは、1、10、100と10倍ずつだね。2進数のけたは、右から1、2、4、8、16と、2倍ずつ大きくなるよ。だから「101」は、4のけたと1のけたに1が立っていて、4+1で5になるんだね。

10進数から2進数に直すには

ミナ
ミナ
逆に、ふつうの数を2進数にするには、どうするんですか?
ラクにゃん
ラクにゃん
2で割っていって、余りを下から読めばいいよ。13でやってみよう。
あまり13 ÷ 2 = 616 ÷ 2 = 303 ÷ 2 = 111 ÷ 2 = 01下から読む13 = 1101確かめ:8 + 4 + 0 + 1 = 13
あまり13 ÷ 2 = 616 ÷ 2 = 303 ÷ 2 = 111 ÷ 2 = 01↑下から読む13 = 1101確かめ:8 + 4 + 0 + 1 = 13
2 で割れなくなるまで割って、余りを下から読む

13を2で割ると6あまり1、6を2で割ると3あまり0、3を2で割ると1あまり1、1を2で割ると0あまり1。余りを下から読むと「1101」。確かめると、8+4+0+1で13です。

ミナ
ミナ
どうして下から読むんですか?
ラクにゃん
ラクにゃん
最初の余りは「2で割れるかどうか」、つまり1のけたの答えだからだよ。2回目は2のけた、3回目は4のけた……と、割るたびに1つ上のけたが分かっていくね。だから、最後に出た余りが、いちばん左のけたになるんだよ。

指で、31まで数える

ラクにゃん
ラクにゃん
2進数は、指でも試せるよ。片手の指に、親指から1、2、4、8、16の重さを割り当てて、立てたら1、折ったら0。
1160804020111 = 12160804021102 = 221160804021111 + 2 = 328160814021102 + 8 = 104161161804120111 + 4 + 16 = 21248161161814121111 + 2 + 4 + 8 + 16 = 31全部立てると 31。片手で 32 とおり
1160804020111 = 12160804021102 = 221160804021111 + 2 = 328160814021102 + 8 = 104161161804120111 + 4 + 16 = 21248161161814121111 + 2 + 4 + 8 + 16 = 31
立てた指=1、折った指=0(手のひら側から見た右手)

親指だけなら1、人さし指だけなら2、両方なら3。全部の指を立てると、1+2+4+8+16で31。片手で0から31まで、32とおりを数えられます。両手の10本なら、0から1023までです。

ミナ
ミナ
指を折るだけで、片手で31まで! ふつうに数えたら5までなのに。

5. ビットとバイト

ラクにゃん
ラクにゃん
この、0か1が入る1けたを「ビット」と呼ぶよ。コンピューターが扱う、いちばん小さな単位なんだよ。このあと出てくる「バイト」とのちがいが、ミナの「100メガ」の話のカギになるから、覚えておいてね。

1ビットで表せるのは0と1の2とおり。2ビットなら00、01、10、11の4とおり。1けた足すたびに、表せる数は2倍になります。

21428316432564612872568ビットの数1バイト16ビット6万553632ビット約43億64ビット約1844京↑ もう、この目盛りには入らない
21428316432564612872568ビットの数1バイト16ビット6万553632ビット約43億64ビット約1844京↑ もう、この目盛りには入らない
1 けた足すたびに 2 倍。8 けた(1 バイト)で 256 とおり
ビットの数表せる数
12とおり
416とおり
8256とおり
166万5536とおり
32約43億とおり
64約1844京とおり(京は、1兆の1万倍)
ミナ
ミナ
64ビットで1844京……。けたを2倍にしただけなのに、43億が1844京になるんですか。
ラクにゃん
ラクにゃん
2倍、2倍が32回重なるからね。これが2進数の強さなんだよ。

なぜ、8ビットで1バイトなの?

ビットを8つ並べたまとまりを「1バイト」と呼びます。1バイトで表せるのは256とおり、0から255までの数です。

ミナ
ミナ
どうして8つなんですか? 10個とか、きりのいい数じゃなくて。
ラクにゃん
ラクにゃん
実は、最初から8と決まっていたわけじゃないんだよ。

「バイト」という言葉は、1956年に、IBMで大型コンピューターを設計していたヴェルナー・ブッフホルツが名づけたものです。当時は、ひとまとまりのビットの数は機械によってばらばらで、6ビット(64とおり)で文字を表す機械も多くありました。6ビットでは、英語の大文字と数字、記号でほぼいっぱいで、小文字までは入りません。

それが8にそろっていくきっかけになったのが、1964年に発表されたIBMの「System/360」です。8ビット(256とおり)なら小文字まで入れてもゆとりがあり、0〜9の数字(4ビットで足りる)なら1バイトに2けた詰められます。しかも8は、2を3回かけた数なので、2進数の機械で扱いやすい。System/360が世界中で使われたことで、「1バイト=8ビット」が当たり前になっていきました。

日本IBMの本社のマシン室に置かれたSystem/360(1967年の本から)。8ビットを1バイトとする考え方を広めた
日本IBMの本社のマシン室に置かれたSystem/360(1967年の本から)。8ビットを1バイトとする考え方を広めた写真:日本IBM/パブリックドメイン/Wikimedia Commons
ラクにゃん
ラクにゃん
0から255までの数は、いろいろな所に出てくるよ。画面の色は、赤・緑・青をそれぞれ0〜255の1バイトで表しているし、「192.168.1.1」みたいなネットワークの住所も、点で区切られた数は1つずつが1バイトだから、どれも255までなんだよ。
電球8つで、1バイト。点いている電球の組み合わせで、0から255までを表す
電球8つで、1バイト。点いている電球の組み合わせで、0から255までを表す

6. けたが足りなくなると、どうなる?

ミナ
ミナ
32ビットで43億もあれば、たいていのものは数えられそうですね。
ラクにゃん
ラクにゃん
そう思うよね。でも、実際に「足りなくなった」ことが何度もあるんだよ。

4けたのメーターで考えてみましょう。10進数のメーターが9999の次に進むと、0000に戻ります。2進数でも同じで、全部のけたが1のときに1を足すと、全部0に戻ってしまいます。これを「けたあふれ(オーバーフロー)」と呼びます。

255 + 1111111111111111101111111001111110001111100001111000001110000001100000001000000001答え:00000000 = 0あふれた 1 は、入るけたがないので消えてしまう
255 に 1 を足すと…111111111111111101111111001111110001111100001111000001110000001100000001000000001答え:00000000 = 0あふれた 1 は、入るけたがないので消えてしまう
メーターが 9999 の次に 0000 へ戻るのと同じ
けたが足りないメーターは、いっぱいまで進むと0に戻る
けたが足りないメーターは、いっぱいまで進むと0に戻る
ミナ
ミナ
255の次が0に! それは困りますね。
ラクにゃん
ラクにゃん
大きな例が、インターネットの住所だよ。

インターネットにつながる機器には、住所(IPアドレス)が付いています。広く使われてきたIPv4という決まりでは、住所は32ビット。約43億個です。決まりができた1980年代には十分すぎる数でしたが、パソコンとスマホが世界中に広がり、2011年には、アジア太平洋の地域で新しく配る住所がほとんどなくなりました。そこで、住所を128ビットに広げたIPv6への切り替えが進められています。

ミナ
ミナ
「これだけあれば足りる」って決めたけたが、あとで足りなくなるんですね。
ラクにゃん
ラクにゃん
うん。だから、システムを作るときは「この数は、いちばん大きくてどこまで増える?」を最初に考えておくのが大事なんだよ。会員番号や伝票番号、金額の合計なんかもね。

7. マイナスの数と、「21億の壁」

ミナ
ミナ
2進数で、マイナスの数はどうするんですか? 0と1しかないなら、「−」の記号もないですよね。
ラクにゃん
ラクにゃん
ここでも、メーターが役に立つよ。0000から、1つだけ逆に回すと、どうなると思う?

4けたの2進数のメーターを0000から1つ戻すと、1111になります。そこで、「1111を−1とする」と決めてしまうのです。もう1つ戻した1110は−2。こうすると、いちばん左のけたが1なら「マイナスの数」、0なら「プラスの数」と見分けられます。この決め方を「2の補数」と呼びます。

0010200011000001111−1マイナスの印1110−2マイナスの印確かめ:−1 + 1 は?1111 + 0001 = 100004 けたしかないので、あふれた 1 は消えて 0000(=0)。ちゃんと合う
0010200011000001111−1マイナスの印1110−2マイナスの印確かめ:−1 + 1 は?1111 + 0001 = 100004 けたしかないので、あふれた 1 は消えて 0000(=0)。ちゃんと合う
いちばん左のけたが 1 なら、マイナスの数(2 の補数)
ミナ
ミナ
ちょっと待ってください。さっき、1111は15でしたよね?
ラクにゃん
ラクにゃん
いいところに気づいたね。同じ1111でも、「マイナスを使わない決まり」で読めば15、「マイナスも使う決まり」で読めば−1なんだよ。どちらで読むかは、プログラムを作る人が、数ごとに決めておくんだよ。
ミナ
ミナ
決まりで、読み方が変わるんですね。
ラクにゃん
ラクにゃん
そう。マイナスも使う決まりにすると、いちばん左のけたは印に使うから、4けたで表せるのは、−8から7までになるよ。数の数は同じ16とおりで、それをマイナスとプラスに半分ずつ分けるんだね。

それに、計算もうまく合います。−1(1111)に1(0001)を足すと10000。でも4けたしかないので、あふれた1は消えて0000。ちゃんと0になります。だから、コンピューターは引き算も、足し算の回路のままで計算できるのです。

21億の壁

ラクにゃん
ラクにゃん
この「半分ずつ」が、思わぬ所で効いてくるんだよ。32ビットでマイナスも使う決まりにすると、プラスの上限は約43億の半分、約21億になるね。

2038年問題

コンピューターの多くは、時刻を「1970年1月1日から何秒たったか」という1つの数で数えています。この数を、マイナスも使える32ビットで持っている仕組みでは、上限は約21億秒。それを超えるのが、日本時間で2038年1月19日の昼12時14分8秒です。そこで数があふれると、いちばん左のけたが1になって大きなマイナスの数になり、時刻が1901年に戻ってしまいます。新しいパソコンやスマホは64ビットで数えるように直されていますが、工場の機械や家電など、機械の中に組み込まれた古いコンピューターでは、確かめが必要です。

0111111111111111111111111111112038年1月19日12:14:05012038年1月19日12:14:06102038年1月19日12:14:07111901年12月14日05:45:52100000000000000000000000000000001970年1月1日からの秒の数(32ビット・いちばん左はプラスとマイナスの印)上限(約21億秒)の次の 1 秒で、いちばん左が 1 になり、大きなマイナスの数=1901年に
0111111111111111111111111111112038年1月19日12:14:05012038年1月19日12:14:06102038年1月19日12:14:07111901年12月14日05:45:52100000000000000000000000000000001970年1月1日からの秒の数(32ビット)上限(約21億秒)の次の 1 秒で、いちばん左が 1 に大きなマイナスの数になり、1901年に戻る
時刻は日本時間

動画の再生回数が、上限を超えた

2014年、ある大ヒット曲のミュージックビデオの再生回数が、約21億を超えそうになりました。動画サイトは、数え方を64ビットに広げて対応しました。「そんなに見られる動画はないだろう」という見込みを、現実が追い越した例です。

ミナ
ミナ
43億じゃなくて、21億で止まっちゃうこともあるんですね。

8. 0.1が、ぴったり表せない

ミナ
ミナ
小数はどうですか? 0.5とか、0.1とか。
ラクにゃん
ラクにゃん
小数は、ちょっと気をつけたい話があるんだよ。10進数で、1÷3を書いてみて。
ミナ
ミナ
0.3333……。ずっと続きますね。
ラクにゃん
ラクにゃん
そう。10進数では、3で割った数は、きっちり書ききれないね。2進数にも同じことがあって、しかも、ふだんよく使う「0.1」が、2進数ではきっちり書ききれないんだよ。

2進数の小数のけたは、0.5、0.25、0.125……と、半分ずつになります。0.1をこれらの組み合わせで作ろうとすると、「0.0001100110011……」と、「0011」の並びが終わらずに続きます。コンピューターは途中で切って覚えるので、0.1は「ほんのわずかにずれた0.1」として記録されます。

10進数:1 ÷ 30.3333333333333333…ずっと続く2進数:0.10.0001100110011001100110011✂どこかで切って覚える → ほんの少しずれた 0.10.1 + 0.2 = 0.3
10進数:1 ÷ 30.333333333333…ずっと続く2進数:0.10.00011001100110011✂どこかで切って覚える → ほんの少しずれた 0.10.1 + 0.2 = 0.3
下は、多くのプログラムで 0.1 と 0.2 を足したときの答え
ミナ
ミナ
じゃあ、計算がまちがうこともあるんですか?
ラクにゃん
ラクにゃん
ずれはとても小さいけど、ゼロではないんだよ。多くのプログラムで0.1と0.2を足すと、0.3ではなく「0.30000000000000004」になるね。表計算ソフトのExcelでも、たとえば「(43.1−43.2)+1」が、0.9ではなく「0.899999999999999」になることがあると、作っているマイクロソフトが説明しているよ。ふだんは表示のけたを丸めて見せているから、気づきにくいんだよ。
合計が1円合わないときは、小数のずれも疑ってみる
合計が1円合わないときは、小数のずれも疑ってみる
ミナ
ミナ
請求書の明細と合計が1円合わない、なんてこともあるんですか?
ラクにゃん
ラクにゃん
1円ずれのいちばん多い原因は、消費税の端数を明細ごとに丸めるか、合計で丸めるかのちがいだよ。でも、小数のずれが重なって、「=」で比べたら一致しない、ということも起きるね。だから、よくある工夫が2つあるよ。
  • 比べる前に、丸める:表計算で「一致するか」を確かめるときは、ROUND関数で、円や小数点以下の決まったけたに丸めてから比べます
  • システムでは、整数で数える:お金を扱うシステムでは、金額を「円」や「銭」の整数にしてから計算することが多いです。整数なら、2進数でぴったり表せます

9. 速さはビット、大きさはバイト

ミナ
ミナ
いよいよ、わたしの「なぜ」ですね。100メガの回線で、2GBが3分近くかかったのは……。
ラクにゃん
ラクにゃん
まず、単位の書き方を見てみよう。回線の速さは「100Mbps」、ファイルの大きさは「2GB」。よく見ると、bの大きさがちがうんだよ。
  • 小文字の b:ビット。回線の速さは、ビットで書きます。Mbpsは「1秒に何メガ(100万)ビット送れるか」
  • 大文字の B:バイト。ファイルの大きさは、バイトで書きます

1バイトは8ビットなので、速さをバイトに直すには、8で割ります。100Mbpsなら、1秒に約12.5MBです。

思っていた速さ1秒に 100MB20秒で完了本当の速さ1秒に 12.5MB(100Mbps ÷ 8)160秒(約2分40秒)で完了÷82GB(2000MB)を送るとき。図の時間は 10 分の 1 に縮めている
思っていた速さ 1秒に 100MB20秒で完了本当の速さ 1秒に 12.5MB(100Mbps ÷ 8)160秒(約2分40秒)で完了÷82GB(2000MB)を送るとき。図の時間は 10 分の 1 に縮めている
回線の速さはビット(b)、ファイルの大きさはバイト(B)
ミナ
ミナ
8分の1! じゃあ、2GBだと……。
ラクにゃん
ラクにゃん
2GBは、ざっくり1000ずつで数えて2000MBだから、12.5で割って160秒。約2分40秒だね。しかも、実際の通信には、宛先を書いたり、届いたか確かめたりする手間があるし、混み具合でも変わるよ。
ミナ
ミナ
それに、「100メガ」って、いちばん速いときの数字ですよね?
ラクにゃん
ラクにゃん
そのとおり。回線の「100メガ」や「1ギガ」は、ふつう「最大で」の数字だよ。だから、3分近くかかっても、ふしぎじゃないんだよ。
回線の「100メガ」は、1秒に送れるビットの数
回線の「100メガ」は、1秒に送れるビットの数
ミナ
ミナ
回線の数字を見たら、8で割る。覚えておきます。

1TBが931GBに見えるわけ

ミナ
ミナ
じゃあ、1TBのディスクが931GBになったのは?
ラクにゃん
ラクにゃん
こっちは、「1000ずつ」と「1024ずつ」の数え方のちがいなんだよ。

ふだんの単位では、キロは1000倍、メガは100万倍、ギガは10億倍、テラは1兆倍です。ディスクを売る会社は、この数え方で「1TB=1兆バイト」と書いています。

ところが、コンピューターの中では、2進数で切りのいい「1024(2を10回かけた数)」ずつで数えることが多いのです。Windowsは、1GBを「1024×1024×1024=約10億7374万バイト」として表示します。1兆バイトを、この1GBで割ると、約931。だから931GBと表示されます。

中身:1兆バイト(売っている「1TB」)1000ずつのものさし(売る側)020040060080010001000GB1024ずつのものさし(Windows)0200400600800約931GB中身の量は同じ。ものさしの目盛りの大きさがちがうだけ
中身:1兆バイト(売っている「1TB」)1000ずつのものさし(売る側)03006009001000GB1024ずつのものさし(Windows)0300600900約931GB中身の量は同じ。ものさしの目盛りの大きさがちがうだけ
1024 ずつの 1GB は、約 10 億 7374 万バイト。1 兆 ÷ 10 億 7374 万 ≒ 931
ミナ
ミナ
中身は同じで、ものさしがちがうだけなんですね! 70GBは消えていなかった。
ラクにゃん
ラクにゃん
そういうこと。Macは1000ずつで表示するから、同じディスクでも「1TB」と出るよ。きちんと分けたいときは、1024ずつの単位を「GiB(ギビバイト)」と書く決まりもあるね。表示がちがっても、まずはこの2つのものさしを思い出してね。

10. 0と1で、何でも表せる理由

ミナ
ミナ
数のことは分かりました。でも、文字や写真や音は、どうやって0と1になるんですか?
ラクにゃん
ラクにゃん
ここまでの話がそのまま使えるよ。ポイントは「決まり」なんだよ。

文字には1つずつ番号を付けた表を決めておき、その番号を2進数で記録します。写真は小さな点の集まりで、1つの点の色を赤・緑・青の3つの数(それぞれ1バイト)で記録します。音は、空気のふるえの高さを、1秒に何万回も測って数にします。

どれも「何を、どの数にするか」という決まりさえ作れば、あとは0と1で記録できます。だから、コンピューターは何でも扱えるのです。メールの文字が読めない記号になる「文字化け」も、書いた側と読む側で、この文字の表がちがうときに起きます。くわしいしくみは、こちらの動画で見られます。

文字・写真・音は、どうやって数になる? 文字コード・16進数・画素を3Dで|ラクにゃんのIT基礎講座
YouTube で見る →
ラクにゃん
ラクにゃん
それから、0と1を実際に計算しているCPUの中のしくみは、こちらの記事で詳しく見ているよ。

CPUはなぜ速くなり続けるの? 合図が速くならなくなった理由と、3つの工夫


おわりに

ミナ
ミナ
回線の「100メガ」も、ディスクの「931GB」も、0と1の数え方が分かったら、ちゃんと理由があったんですね。
ラクにゃん
ラクにゃん
そうだね。今日の話をまとめるよ。
  • 0と1の2つを使うのは、ゆれに強く(あいだに余白を作れる)、部品を小さく作りやすいから。10進や3進も試されたけど、2進が残った
  • 2進数のけたは1、2、4、8と2倍ずつ。1けた足すと、表せる数が2倍になる
  • 8ビットで1バイト(256とおり)。8になったのは、1960年代のコンピューターから
  • けたが足りなくなると、メーターのように0に戻る。IPv4の住所がその例
  • マイナスは「メーターの巻き戻し」で表す。32ビットでは上限が約21億になり、2038年問題につながる
  • 0.1は2進数ではぴったり書けない。比べる前に丸める、システムでは整数で
  • 回線の速さはビット、ファイルの大きさはバイト。8で割る。1000ずつと1024ずつで、表示がちがう
ミナ
ミナ
次に「100メガ」って聞いたら、すぐ8で割ってみます。
ラクにゃん
ラクにゃん
うん、それだけで、待ち時間の見込みがぐっと正確になるよ。

YouTubeでも、2進数とビット・バイトのしくみを解説しているよ。

2進数を知らなかったころ、手も足もしっぽも使って数えようとして目を回すラクにゃん

参考サイトと出典

この記事をシェア