KiB, MiB, GiB 〜 120GBと言われたデータが128GBのUSBメモリに収まらない理由

## はじめに
　知ってしまえばどうということはない話だった。突き詰めれば **KB** と **KiB** の違い。ファイルサイズやディスクの使用サイズ、空き容量などを調べるとみかけるこれらの表記。大した違いじゃないだろうと思ってたものの、地味に気にはなっていた。
　今回、古いディスクのパーティション分割やフォーマットの機会があったので、ついでに調べてみた。

:::note warn
身近にあった例が表題の件。思い返せば、**128 GB** のUSBメモリを買ったのに、サイズが **119 GiB** と表示されたのにもびっくりした記憶。
:::

## 予備知識

GBはさておきKBから。

KBはキロバイト、KiBはキビバイトと読む。違うのは読み方だけでなく、定義も違うし、具体的なバイト数も異なる。
```
1 KB  = 1000 B = 10^3 B（10の3乗バイト）
1 KiB = 1024 B = 2^10 B（2の10乗バイト）
```
前者のKは10進数が基準のSI接頭語であり慣れ親しんだ表現だけど、後者は2進接頭語を用いた表現であり馴染みが薄い。これまであまり気にしてなかったけど、**それぞれ1000倍、1024倍して接頭語が1段階上がるたびに差が広がっていく。大して変わらないだろうと軽視してると、ギガを超えたあたりで痛い目を見る**。（というか見た）

よく知られているように、10進数が基準のSI接頭語の世界では1000倍していくごとにキロ=K、メガ=M、ギガ=G、テラ=Tといった略記号が用いられる。1MBは1000KBで、1TBは1000GBだ。一方、2進接頭語の世界ではこれに対応する形で1024倍していく。それが KiB=キビバイト、MiB=メビバイト、GiB=ギビバイト、TiB=テビバイト。
```
1 MiB = 1,024 KiB
      = 1,024 * 1,024 Byte
      = 1,048,576 Byte

1 GiB = 1,024 MiB
      = 1,024 * 1,024 * 1,024 バイト
      = 1,073,741,824 バイト

1 TiB = 1,024 GiB
      = 1,024 * 1,024 * 1,024 * 1,024 バイト
      = 1,099,511,627,776 バイト
```
これらを SI接頭語を用いて表すなら
```
1 MiB ≒ 1,048 KB
      > 1 MB

1 GiB ≒ 1,073 MB
      > 1GB

1 TiB ≒ 1,099 GB 
      >> 1TB
```
となる。**1TiBと1TBの差は99GB、実に1割近くもあり、目を疑う**。

## メモリのサイズが思ってたのと違うけど

以上が日常で見かけるデータサイズやディスク容量の表記に対する違和感の正体。そして冒頭でも触れた例のように、USBメモリのサイズが買った時とPCに差して見たときとで
```
16 GB → 14.4 GiB
128 GB → 119.2 GiB
```
となってびっくりしたり、騙されたor損した気分になるのもそういうこと（実際にはファイルシステムやOSが管理領域を確保したりするので、空き容量はもっと小さい）。

しかしこれはUSBメモリ等の商品パッケージの誤表記ではない。くどいようだが 16GiB や 128GiB という表記じゃないのは定義上違うから当然だし、GBとGiBとでは実際の差が無視できないくらい大きいので、なおさら当然。よく見るとわかるが128GBのメモリはちゃんと
```
128 GB  = 128,000,000,000 Byte
```
分の容量はある。（大抵はこれよりも少し多めに作ってあるようだ）。

もしこの 128GB を 128 GiB と同一視しちゃうと嘘になっちゃう。
```
128 GiB = 128 * 1024 * 1024 * 1024 Byte
        = 137,438,953,472
        ≒ 137 GB
```
※実際には128GBのものを137GBのものとして売るわけにはいかない。

そしてこの手の混乱がもたらされた結果、例えば、実際は 120GiB のデータなのに「120GB のデータだよ」と言われてもらったものが 128GBのUSBメモリ（総容量 119.2 GiB）に入らなかったりするのもこういうこと。

定義を知ってしまえば当たり前のことだけど、要するにこういうことだ。
```
1 KiB  > 1 KB
1 MiB  > 1 MB
1 GiB  > 1 GB
1 TiB >> 1 TB
...
```

## 同程度のオーダーで生じる差異

接頭語の定義の違いは分かったけど、個人的に知りたいのは1バイト単位での正確な数値なのだった。（パーティションを正確に切りたかったので）。欲しい一覧が意外とすぐに見つからなかったので、計算してまとめた。

:::note info
パーティション分割に使う `fdisk` コマンドは +1G とサイズ指定したときに GiB で計算してくれる。今回作った一覧で確認できた。他の接頭語も同様。期待した方の仕様で良かった。
:::

:::note info
なお、Y=ヨタやYiB=ヨビバイトの上の接頭語は2022年11月に決まるらしい。奇遇にもホットな話題だったので、先行して書いておいた。確定でないので ? を付けてある
:::
※SI接頭語は 10^(3\*n), 2進接頭語は 2^(10\*n) のようにも書けるが比較しやすいようにした。

|   | SI接頭語 |  べき表記(SI) || 2進接頭語 | べき表記(2進) | バイト数（2進接頭語表記の場合） | 差(2進 - SI) |
|-:|-:|-:|-:|-:|-:|-:|-:|
|    |       1 | 1000^0 |                                            |       1 | 1024^0 |                                          1 |                                          0 |
|    |       k | 1000^1 |                                            |     KiB | 1024^1 |                                      1,024 |                                         24 |
|    |       M | 1000^2 |                                            |     MiB | 1024^2 |                                  1,048,576 |                                     48,576 |
|    |       G | 1000^3 |                                            |     GiB | 1024^3 |                              1,073,741,824 |                                 73,741,824 |
|    |       T | 1000^4 |                                            |     TiB | 1024^4 |                          1,099,511,627,776 |                             99,511,627,776 |
|    |       P | 1000^5 |                                            |     PiB | 1024^5 |                      1,125,899,906,842,624 |                        125,899,906,842,624 |
|    |       E | 1000^6 |                                            |     EiB | 1024^6 |                  1,152,921,504,606,846,976 |                    152,921,504,606,846,976 |
|    |       Z | 1000^7 |                                            |     ZiB | 1024^7 |              1,180,591,620,717,411,303,424 |                180,591,620,717,411,303,424 |
|    |       Y | 1000^8 |                                            |     YiB | 1024^8 |          1,208,925,819,614,629,174,706,176 |            208,925,819,614,629,174,706,176 |
|    |      R? | 1000^9 |                                            |    RiB? | 1024^9 |      1,237,940,039,285,380,274,899,124,224 |        237,940,039,285,380,274,899,124,224 |
|    |      Q? | 1000^10 |                                            |    QiB? | 1024^10 |  1,267,650,600,228,229,401,496,703,205,376 |    267,650,600,228,229,401,496,703,205,376 |


:::note warn
kBとKiBの間では誤差は2.4%程度だけどTBとTiBになると9.9%で約1割に拡大する。さらにその約1テラ倍に相当するYBとYiBになると2割に拡大する。 
:::

## 読み方

2進接頭語の記号は「●iB」という表記だけど、読み方は「●ィビバイト」とは限らないらしい。身近なKiBは「キビバイト」、GiBは「ギビバイト」だけど、MiBはミビバイトではなく「メビバイト」、TiBはティビバイトやチビバイトではなく「テビバイト」と読むとのこと。SI接頭語の発音を知ってたら類推しやすいというのがまた悩ましい。

```
k        M     G    T    P    E    Z     Y     R?     Q?
Kilo     Mega  Giga Tera Peta Exa  Zetta Yotta Ronna? Quetta?

KiB      MiB   GiB  TiB  PiB  EiB  ZiB   YiB   RiB?   QiB?
Kibibyte Mebi- Gibi Tebi Pebi Exbi Zebi  Yobi  Robi?  Quebi?
```

ただやはり、そのうちMiBをミビバイト、TiBをティビバイトとか読み始めて混乱しそう。

:::note info
TiBはチビバイトじゃないぞって思い出そう。
:::

## 大文字と小文字の区別

実はキロバイトは正しくはkBと表記するのが正しいのだとか。そういえばkgとかkmとかは確かにそう。でも「キロバイト」のかな漢字変換で「KB」が出たりと、世の中的にも混乱している。WindowsとかURLとか、大文字小文字を区別しない文化もあるから、ありがちな自然か。

大文字小文字の区別といえば、Bはバイトでbはビット。1バイト=8ビット=2^3ビットでバイトの考え方自体が2進数由来なわけだけど、にもかかわらず以前から1KBなどと言っていた頃から既にまかれていた混乱の種が、大容量の時代に芽吹いたということか。

## おわりに

GBやGiB、TBやTiB、もっと大きなオーダーの略記号を見かけたら、どちらの意味なのか注意しよう。違いは大きい。身近な単位で大雑把に言うと、
```
  1 MiB =   1.05 MB
100 MiB = 105    MB
  1 GiB =   1.07 GB
100 GiB = 107    GB            <----- 7GB !
  1 TiB =   1.10 TB = 1100 GB  <--- 100GB !!
```
なのだ。

そしてできればGiBやTiBを使う方が良いだろう。

## 参考資料

https://en.wikipedia.org/wiki/Binary_prefix