KBとKiBの違い:SI接頭辞とバイナリ接頭辞、なぜ混乱が続くのか

約7分

「1 KB = 1000 バイト? 1024 バイト?」という質問は、技術職でも答えが揺れる奇妙な問題です。歴史的な慣習と業界ごとの使い分けが絡んだ結果、両方の解釈が並行して生き続けています。本記事ではこの混乱の整理と、IEC が定めた正規表記を解説します。

SI接頭辞:10 のべき乗

国際単位系(SI)で定義された接頭辞は 10 のべき乗です:

接頭辞記号
キロk10^3 = 1,000
メガM10^6 = 1,000,000
ギガG10^9 = 1,000,000,000
テラT10^12
ペタP10^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 年にバイナリ接頭辞を別記号で定義しました:

接頭辞記号
キビKi2^10 = 1,024
メビMi2^20 = 1,048,576
ギビGi2^30
テビTi2^40
ペビPi2^50

ルール:

  • KB = 1000 バイト(SI、10 のべき乗)
  • KiB = 1024 バイト(IEC、2 のべき乗)

「キビバイト」「メビバイト」と読みます。Linux や macOS の dfdu コマンドは 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^3M = 10^6
  • IEC:2 のべき乗、Ki = 2^10Mi = 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 の差を見たい場面で使えます。