KBとKiBの違い:SI接頭辞とバイナリ接頭辞、なぜ混乱が続くのか
「1 KB = 1000 バイト? 1024 バイト?」という質問は、技術職でも答えが揺れる奇妙な問題です。歴史的な慣習と業界ごとの使い分けが絡んだ結果、両方の解釈が並行して生き続けています。本記事ではこの混乱の整理と、IEC が定めた正規表記を解説します。
SI接頭辞:10 のべき乗
国際単位系(SI)で定義された接頭辞は 10 のべき乗です:
| 接頭辞 | 記号 | 値 |
|---|---|---|
| キロ | k | 10^3 = 1,000 |
| メガ | M | 10^6 = 1,000,000 |
| ギガ | G | 10^9 = 1,000,000,000 |
| テラ | T | 10^12 |
| ペタ | P | 10^15 |
「1 km = 1000 m」「1 kg = 1000 g」は誰も疑問を持ちません。これと同じ規則で、本来 1 KB = 1000 バイトになるはずです。
バイナリ接頭辞:2 のべき乗
ところがコンピュータの世界では、メモリ容量や OS のストレージ表示で 2 のべき乗 の値が頻出します:
| 接頭辞 | 値 | SI との差 |
|---|---|---|
| 1 KB(俗用) | 1024 = 2^10 バイト | +2.4% |
| 1 MB(俗用) | 1,048,576 = 2^20 バイト | +4.9% |
| 1 GB(俗用) | 2^30 バイト ≈ 1.074 × 10^9 | +7.4% |
| 1 TB(俗用) | 2^40 バイト ≈ 1.100 × 10^12 | +10.0% |
| 1 PB(俗用) | 2^50 バイト ≈ 1.126 × 10^15 | +12.6% |
メモリは 2 のべき乗で容量が決まるため、「1 KB = 1024 バイト」という慣習が生まれました。SI 規則と矛盾しますが、KB という記号を流用してしまったことが混乱の元です。
差は小さいうちは無視されがちですが、テラ・ペタ単位になると 10% 以上ずれます。
IEC の正規表記:KiB、MiB、GiB
この混乱を解消するため、IEC(国際電気標準会議)は 1998 年にバイナリ接頭辞を別記号で定義しました:
| 接頭辞 | 記号 | 値 |
|---|---|---|
| キビ | Ki | 2^10 = 1,024 |
| メビ | Mi | 2^20 = 1,048,576 |
| ギビ | Gi | 2^30 |
| テビ | Ti | 2^40 |
| ペビ | Pi | 2^50 |
ルール:
- KB = 1000 バイト(SI、10 のべき乗)
- KiB = 1024 バイト(IEC、2 のべき乗)
「キビバイト」「メビバイト」と読みます。Linux や macOS の df、du コマンドは IEC 表記をサポート(-h オプション)。
ストレージや RAM 容量を表示するときに「KiB」「MiB」「GiB」を使うのが厳密に正しい表記です。
業界ごとの慣習:どっちを使うかが分野で違う
正規表記が決まった後も、各業界の慣習はばらばらです。
ハードディスク・SSD:SI(1 GB = 10^9 バイト)
ハードディスクメーカーは販売開始から一貫して SI 表記を使っています:
- 「1 TB SSD」のスペック:1,000,000,000,000 バイト(10^12)
- OS で見ると:「931 GB」(実際は 931 GiB ≈ 1 TB)
ユーザーから「1 TB と書いてあるのに 931 GB しかない」というクレームが定番化しています。これは詐欺ではなく、メーカーが SI 表記、OS がバイナリ表記を使っているという表示の違いです。
メモリ(RAM):バイナリ(1 GB = 2^30 バイト)
DRAM のチップ容量は 2 のべき乗で設計されるため、本来 GiB で書くべきところを業界慣習で「GB」と表記します。
- 「16 GB DDR5」:実際は 16 GiB = 17.18 GB(SI 換算)
メモリで「GB」と書かれていたら、99% の場合「GiB」のことです。
ネットワーク帯域:SI、ビット単位
ネットワーク帯域は bps(bits per second) で表記され、SI を使います:
- 「1 Gbps」回線:10^9 ビット/秒 = 約 125 MB/秒(バイト換算)
「1 Gbps の回線でファイルを 1 GB 落とすのに 8 秒」という計算は注意が必要:
- 帯域:1 Gbps = 10^9 ビット/秒 = 1.25 × 10^8 バイト/秒
- ファイル:1 GB(OS が GiB 表示なら)= 2^30 ≈ 1.07 × 10^9 バイト
- 時間:1.07 × 10^9 ÷ 1.25 × 10^8 ≈ 8.6 秒
bit と Byte(小文字 b と大文字 B)も別物です。8 倍違うので、Gbps と GB/s を混同すると桁が外れます。
CPU クロック:SI(1 GHz = 10^9 Hz)
CPU クロックは時間の単位なので SI で表記。混乱しません。
実装で気をつける場面
1. ファイルサイズ表示
ユーザー向けには分かりやすさが優先で、正規表記より「KB」「MB」が好まれます。バイナリ表記なのか SI 表記なのかは内部で固定し、ドキュメントで明示するのが安全:
function formatBytes(bytes, useBinary = true) {
const base = useBinary ? 1024 : 1000;
const prefixes = useBinary ? ['B', 'KiB', 'MiB', 'GiB'] : ['B', 'KB', 'MB', 'GB'];
let i = 0;
while (bytes >= base && i < prefixes.length - 1) {
bytes /= base;
i++;
}
return `${bytes.toFixed(1)} ${prefixes[i]}`;
} 2. ストレージ容量計算
データベースのキャパシティ計画では SI とバイナリの差を意識して計算:
- 「100 GB のデータ」が 100 GiB なのか 100 GB(SI)なのかで、10 GB 程度ずれる
- 大規模ストレージほど影響が大きい
3. ログ出力
サーバーログでは IEC 表記(GiB)を使うのが厳密。ただし慣習で GB と書く現場が多く、混在に注意。
4. API レスポンス
API でサイズを返すときは 生のバイト数(整数) で返すのが安全。表示は呼び出し側で変換:
{ "fileSize": 5368709120 } // 5 GiB / ~5.37 GB 「5 GB」のような文字列表記は、受け取り側でパースが必要になります。
まとめ
- SI:10 のべき乗、
k = 10^3、M = 10^6 - IEC:2 のべき乗、
Ki = 2^10、Mi = 2^20 - HDD/SSD:SI 表記
- RAM:バイナリ表記だが「GB」と書かれることが多い
- ネットワーク:SI、bit 単位
- bit と Byte:8 倍違う(小文字 b と大文字 B)
技術文書では IEC 表記(KiB、MiB、GiB)を使うのが厳密。ユーザー向けには KB、MB、GB(バイナリ解釈)が分かりやすい、という現実的な使い分けが落とし所です。
異なる単位の変換を確認したいときは、本サイトのバイト変換ツールで KB / KiB / MB / MiB を相互変換できます。SI と IEC の差を見たい場面で使えます。