結論

KB・MB・GB は1000ごと(1GB=1,000,000,000バイト)、KiB・MiB・GiB は1024ごと(1GiB=1,073,741,824バイト)に単位が上がります。製品の「500GB」が Windows で約465GBと表示されるのは、中身が減ったのではなく、Windows が1024進で計算した値に「GB」と付けて表示しているためです。

この記事でわかること

  • 1000進と1024進を同時に出す換算ツールと、B〜PB/KiB〜PiB の換算表
  • 500GBのファイルを作って df・ls・du・Python・Java・Go・PHP・PostgreSQL で表示させた実物
  • フォーマット後にさらに減る分(ext4 で実測)と、設定ファイルで単位を取り違えたときの直し方

2026年11月7日更新|Ubuntu 24.04・GNU coreutils 9.4・Python 3.13・PostgreSQL 16 で実行確認

データ容量の単位換算を読み込み中です。

上の換算欄に数と単位を入れると、1000進(KB・MB・GB・TB・PB)と1024進(KiB・MiB・GiB・TiB・PiB)の値、バイト数とビット数が一覧で出ます。GB・TB・MB を選んだときは、Windows で何と表示されるかと、何%少なく見えるかも出ます。使い方の詳細は「換算ツールの使い方」の節にまとめました。

flowchart TD
    A[製品の表示 500GB] --> B[500,000,000,000 バイト]
    B --> C[1000で3回割る]
    B --> D[1024で3回割る]
    C --> E[500 GB<br>macOS・製品の箱]
    D --> F[465.66 GiB<br>Windows は GB と表示]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
1GBは何MB? 1000MB(1024進なら 1GiB=1024MiB) 単位の一覧と換算表
1MBは何KB? 1000KB(1MiB=1024KiB) 単位の一覧と換算表
1000と1024どっちが正しい? KB・MB・GB は1000。1024を表すときは KiB・MiB・GiB と書くのが国際規格 KBとKiBの違い
500GBのSSDが465GBになる 500,000,000,000 ÷ 1024³ = 465.66。Windows は GiB の値を GB と表示する 500GBが465GBになる計算
1TBのHDDが931GBになる 1,000,000,000,000 ÷ 1024³ = 931.32 500GBが465GBになる計算
MiB・GiB の読み方 メビバイト・ギビバイト(KiB はキビバイト) 単位の一覧と換算表
Linux の df -h と df -H -h は1024進、-H(--si)は1000進。同じディスクが 252G と 271G になった Linux の df・ls・du
メモリが1024進なのはなぜ メモリは2の累乗の大きさで作られるため。16GBのメモリは正確には16GiB メモリは1024進

この記事で実際に動かしたもの:500,000,000,000バイト(製品表示の500GB)の中身の無いファイルを作り、Linux の ls・du・numfmt・df・free・dd、Python・Node.js・Java・Go・PHP、PostgreSQL の pg_size_pretty で表示させました。1,000,000,000バイトのディスクイメージを ext4 でフォーマットし、使える容量も測っています。

確認環境:Ubuntu 24.04.5 LTS(Linux 6.18)の上で、GNU coreutils 9.4 の ls・du・df・numfmt・dd、procps-ng 4.0.4 の free、e2fsprogs 1.47.0 の mkfs.ext4・dumpe2fs を使いました。プログラムは Python 3.13.18、Node.js 22.23.4、OpenJDK 21.0.12.1、Go 1.24.7、PHP 8.3.6 で実行し、PostgreSQL 16.15 は作業用のフォルダーに作ったデータベースを UNIX ソケットだけで起動して確かめています。ディスクイメージはマウントせず、フォーマットの結果を dumpe2fs で読んでいます。換算ツールの表示は Chromium(Chrome for Testing 153・Playwright 1.63)で 127.0.0.1 の確認用ページを開いて確かめ、入力中に外部への通信が起きないことも確かめました。Windows と macOS の表示の決まりは Microsoft Learn と Apple の公式サポート、2進接頭辞の定義は NIST、coreutils のオプションは GNU の公式マニュアル、PostgreSQL・Kubernetes の単位は各公式ドキュメントで確かめています。図は mermaid 11.16.0 で描画を確かめました(確認日 2026年11月7日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「データ容量の単位換算|KBとKiB・GBとGiBの違い(1000と1024)」

KBとKiB・MBとMiB・GBとGiBの違い(1000と1024)

この節では、KB と KiB がなぜ別の単位なのか、どちらが「正しい」のかが分かります。

KB(キロバイト)は1000バイト、KiB(キビバイト)は1024バイトです。「キロ」は1キロメートル=1000メートルと同じ SI 接頭辞で、1000倍を表します。コンピューターは2進数で動くため、2の10乗=1024が1000に近いことから、以前は1024バイトのことも「1KB」と呼んでいました。この2つを区別するために、国際電気標準会議(IEC)が1998年12月に2進接頭辞(キビ・メビ・ギビ…)を承認し、1999年1月に IEC 60027-2 の追補として公表しました(NIST の説明)。

1000進(SI 接頭辞)

KB・MB・GB・TB・PB

1GB=10の9乗=1,000,000,000バイト

ストレージ製品・macOS・iOS・通信速度

1024進(2進接頭辞)

KiB・MiB・GiB・TiB・PiB

1GiB=2の30乗=1,073,741,824バイト

メモリ・Windows の表示・多くの Linux コマンド

NIST は、2進接頭辞は SI(国際単位系)の一部ではないこと、SI の「kilo」は1000を意味することを明記しています。つまり、規格どおりに書くなら「1KB=1000バイト」で、1024バイトを表したいときは「1KiB」と書きます。ただし Windows のように、1024進で計算した値に KB・MB・GB と付けて表示するソフトも今も多く、同じ「GB」でも1000進か1024進かは、表示している側の決まりを確かめないと分かりません。

「1GB」と書くとき

あいまい「メモリ 16GB」「ファイル 2GB」と単位だけ書き、1000進か1024進かは読む人任せにする
→
はっきり1024進なら「16GiB」、仕様書ではバイト数(17,179,869,184バイト)も添える

見分ける問い:「その数字を1000で割ったのか、1024で割ったのか」

データ容量の単位換算ツールの使い方

この節では、記事の冒頭に置いた換算ツールで何ができるか、どの順に使うと早いかが分かります。

1

数と単位を入れる

入力欄に数(「1,000」のようにカンマ付きでも読めた)を入れ、単位を B・KB〜PB(1000進)・KiB〜PiB(1024進)から選ぶ。最初は「500 GB」が入っている。

入力

2

見本ボタンで試す

「SSD 500GB」「HDD 1TB」「USB 64GB」「メモリ 16GiB」「4GiB(32ビットの上限)」のボタンで、よくある値をすぐ出せる。

見本

3

一覧表を読む

左の列が1000進(KB・MB・GB・TB・PB)、右の列が1024進(KiB・MiB・GiB・TiB・PiB)。最後の行にバイト数とビット数が出る。

結果

4

Windows での見え方を読む

単位に MB・GB・TB を選んだときだけ、「Windows では約◯◯と表示される」「約◯%少なく見える」の説明が出る。

説明

Chromium で見本ボタンを押したときの表示は次のとおりです(1024進の列の値と説明文を抜き出しています)。

押したボタン 1024進の主な値 ツールの説明文(要約)
SSD 500GB 465.7 GiB/476,837 MiB Windows では約 465.7 GB。約 6.9% 少なく見える
HDD 1TB 931.3 GiB/0.909495 TiB Windows では約 931.3 GB(0.909495 TB)。約 9.1% 少なく見える
USB 64GB 59.6 GiB Windows では約 59.6 GB。約 6.9% 少なく見える
メモリ 16GiB 16 GiB(1000進では 17.18 GB) 説明は出ない(もとから1024進の単位のため)
4GiB(32ビットの上限) 4 GiB(4,294,967,296バイト) 説明は出ない
  • TB を選ぶと、説明文には Windows で見慣れた「GB」の形(1TB なら約 931.3 GB)と、TB の形(0.909495 TB)の両方が出ます。どちらも同じ表の「931.3 GiB」「0.909495 TiB」の行と同じ値です。
  • 0より小さい数を入れると「0以上の数を入れます。」と出て、表は出ません。
  • 入力した値はブラウザの中で計算され、外部には送信されません(入力中の通信が0件だったことを確かめました)。

単位の一覧と換算表(B・KB〜PB と KiB〜PiB)

この節では、各単位のバイト数・読み方と、1GBは何MBかといった換算の答えが一覧で分かります。

1000進の単位 バイト数 1024進の単位(読み方) バイト数
1 KB(キロバイト) 1,000 1 KiB(キビバイト) 1,024
1 MB(メガバイト) 1,000,000 1 MiB(メビバイト) 1,048,576
1 GB(ギガバイト) 1,000,000,000 1 GiB(ギビバイト) 1,073,741,824
1 TB(テラバイト) 1,000,000,000,000 1 TiB(テビバイト) 1,099,511,627,776
1 PB(ペタバイト) 10の15乗 1 PiB(ペビバイト) 2の50乗(1,125,899,906,842,624)

単位どうしの換算は、1000進どうし・1024進どうしで閉じています。

  • 1GB=1000MB、1MB=1000KB、1TB=1000GB(1000進)
  • 1GiB=1024MiB、1MiB=1024KiB、1TiB=1024GiB(1024進)
  • 1バイト=8ビット。1KB=8,000ビット、1KiB=8,192ビット
  • 小文字の「kB」は1000バイトを表す書き方です。GNU coreutils のマニュアルは、kB を1000、k・K・KiB を1024と説明しています。

製品の容量でよく見る値を、1024進(Windows の表示)に直した表です。Python で計算しました。

製品の表示(1000進) バイト数 1024進の値
32GB32,000,000,00029.80 GiB
64GB64,000,000,00059.60 GiB
128GB128,000,000,000119.21 GiB
256GB256,000,000,000238.42 GiB
500GB500,000,000,000465.66 GiB
512GB512,000,000,000476.84 GiB
1TB1,000,000,000,000931.32 GiB
2TB2,000,000,000,0001,862.65 GiB(1.82 TiB)
4TB4,000,000,000,0003,725.29 GiB(3.64 TiB)

1000進と1024進の差は桁が上がるほど広がる

この節では、KB では小さい差が、TB・PB ではなぜ1割近くになるのかが分かります。

1024は1000より2.4%大きいだけですが、単位が1つ上がるたびにこの差が掛け算で重なります。GB は1024を3回掛けるので約7.4%、TB は4回で約10%の差になります。Python で計算した値です。

単位 1000進のバイト数 1024進のバイト数 1000進の値が少なく見える割合
KB と KiB1,0001,0242.34%
MB と MiB1,000,0001,048,5764.63%
GB と GiB1,000,000,0001,073,741,8246.87%
TB と TiB10の12乗1,099,511,627,7769.05%
PB と PiB10の15乗1,125,899,906,842,62411.18%
6.9%GB と GiB の差500GB → 465.66GiB
9.1%TB と TiB の差1TB → 931.32GiB
11.2%PB と PiB の差データセンター規模

「少なく見える割合」は、1000進の値を1024進で読んだとき何%減るか(1 − 1000ⁿ÷1024ⁿ)です。逆に、1024進の値を1000進で数えると何%増えるかは、GB で7.37%、TB で9.95%になります。どちらの向きの割合かで数字が変わるので、比べるときは向きをそろえます。

「500GBが465GB」「1TBが931GB」になる計算

この節では、買ったストレージの容量が少なく表示される理由を、計算と実物で確かめられます。

500GBのSSDは500,000,000,000バイトです。これを1024で3回割ると465.66になります。Windows はこの値に「GB」と付けて表示するので、「465GB」に見えます。中身のバイト数は同じです。

500,000,000,000 ÷ 1024 ÷ 1024 ÷ 1024 = 465.66 …(GiB)
1,000,000,000,000 ÷ 1024 ÷ 1024 ÷ 1024 = 931.32 …(GiB)
64,000,000,000 ÷ 1024 ÷ 1024 ÷ 1024 = 59.60 …(GiB)

手元で、中身を持たない(ディスクを使わない)500,000,000,000バイトのファイルを作り、同じファイルを2通りの単位で表示させました。

$ truncate -s 500000000000 ssd500.img
$ ls -l ssd500.img
-rw-r--r-- 1 root root 500000000000 Nov  6 16:35 ssd500.img
$ ls -lh ssd500.img
-rw-r--r-- 1 root root 466G Nov  6 16:35 ssd500.img
$ ls -l --si ssd500.img
-rw-r--r-- 1 root root 500G Nov  6 16:35 ssd500.img

同じ500,000,000,000バイトが、-h(1024進)では466G、--si(1000進)では500Gと表示されました。ls は465.66を切り上げて466Gと出しています(ファイルの日時は UTC の表示です)。製品表示とOSの表示の差は、この「割る数の違い」と「単位の付け方の違い」の2つで説明できます。

Windows・macOS での見え方

Microsoft Learn の Azure Files の説明では、Windows は2進(1024進)で計算し、その値を一貫して10進の単位(KB・MB・GB・TB)で表示していると整理されています。Apple の公式サポートは、Apple 製品は10進(1GB=10億バイト)で容量を表示し、iOS 10 以前・OS X Leopard 以前は2進で表示していたと説明しています。このため、同じ500GBのSSDが、macOS では500GB、Windows では約465GBと表示されます。

表示する側 計算 単位の表示 500GB製品の見え方
ストレージ製品の箱・仕様1000進GB500GB
Windows1024進GB(中身は GiB)約465GB
macOS・iOS(現在)1000進GB500GB
Linux の ls -lh・df -h1024進G(単位の文字だけ)466G
Linux の ls --si・df -H1000進G500G

自分で確かめる(Windows・Linux・Python)

  • 1Windows:換算ツールに製品の容量を入れて画面の値と比べるツールの「1024進」の列(GiB)の値が、Windows の画面で「GB」と出ている値に当たる
  • 2Linux:ls -l と ls -l --si を並べるls -l はバイト数そのまま、--si は1000進、-h は1024進。3つの差が単位の差
  • 3Python:1行で割り算するpython3 -c "print(500*10**9/2**30)" で 465.66… が出る

Linux の df -h と df -H・ls -lh・du の違い

この節では、Linux のコマンドがどの単位で表示するのか、1000進と1024進を切り替える方法が分かります。

GNU coreutils の df・du・ls は、-h(--human-readable)で1024進、--si で1000進になります。df だけは -H が --si と同じ意味です。同じディスクを2通りで表示させました。

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda        252G   14G   29G  33% /
$ df -H /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda        271G   15G   31G  33% /
$ df -B1 / | tail -1
/dev/vda       270553174016 14582976512 30360637440  33% /

Size は 270,553,174,016バイトで、1024³で割ると251.97(252G)、1000³で割ると270.55(271G)です。どちらも切り上げで表示されています。同じディスクが「252G」と「271G」になり、約19G(7%)の差があります。

du とファイルの大きさでも同じことが起きます。中身の無いファイルは、実際に使っているディスクの量(du の既定)が0で、見かけの大きさ(--apparent-size)が500GBです。

$ du -h ssd500.img
0	ssd500.img
$ du -h --apparent-size ssd500.img
466G	ssd500.img
$ du --si --apparent-size ssd500.img
500G	ssd500.img

数を直接変換したいときは、coreutils の numfmt が使えます。--to=iec は1024進(単位の文字だけ)、--to=iec-i は1024進で「Gi」のように i を付け、--to=si は1000進です。

$ numfmt --to=si 500000000000; numfmt --to=iec 500000000000; numfmt --to=iec-i 500000000000
500G
466G
466Gi
$ numfmt --to=si 1000000000000; numfmt --to=iec-i 1000000000000
1.0T
932Gi
$ numfmt --from=iec-i 16Gi
17179869184
$ numfmt --from=auto 1Ki 1K
1024
1000

dd は、コピーした量を1000進と1024進の両方で表示します。1MiB(bs=1M)を100回書くと「105 MB, 100 MiB」、1,000,000バイト(bs=1000000)を100回書くと「100 MB, 95 MiB」でした。dd の bs=1M は1,048,576バイトで、1,000,000バイトではありません。

$ dd if=/dev/zero of=z bs=1M count=100
104857600 bytes (105 MB, 100 MiB) copied, 0.0717965 s, 1.5 GB/s
$ dd if=/dev/zero of=z bs=1000000 count=100
100000000 bytes (100 MB, 95 MiB) copied, 0.0377709 s, 2.6 GB/s
コマンド 1024進で出す 1000進で出す バイト数で出す
lsls -lhls -l --sils -l
dfdf -hdf -Hdf -B1
dudu -hdu --sidu -b
freefree -h(Gi と表示)free -h --sifree -b
numfmt--to=iec-i--to=si--from=…

環境変数 BLOCK_SIZE に si や human-readable を入れると、df・du・ls の既定の表示をまとめて変えられます(GNU coreutils のマニュアル)。df・du の読み方と、容量を食っているフォルダーを探す方法は、関連記事「duコマンドの使い方|容量を大きい順に表示・オプション一覧・dfとの差」で扱っています。ls の各列の意味は、関連記事「lsコマンドのオプション一覧とls -lの見方|パーミッション図解」で扱っています。

フォーマット後に使える容量がさらに減る理由(ext4 で実測)

この節では、1000進と1024進の差のほかに、ファイルシステムの管理領域で容量が減る分が分かります。

単位の差だけでは、使える容量は説明しきれません。フォーマットすると、ファイルの場所を記録する表(inode)・ジャーナル・予約領域などに容量が使われます。1,000,000,000バイト(製品表示の1GB)のイメージを ext4 の既定の設定でフォーマットし、dumpe2fs で読みました。

$ truncate -s 1000000000 fs1g.img
$ mkfs.ext4 -q -F fs1g.img
$ dumpe2fs -h fs1g.img | grep -E "Block count|Reserved block count|Free blocks|Block size|Overhead"
Block count:              244140
Reserved block count:     12207
Overhead clusters:        8533
Free blocks:              235601
Block size:               4096
段階 バイト数 1024進 製品表示から
製品表示の1GB1,000,000,000953.67 MiB−4.6%(単位の差)
4KiB ブロックで割り切れる分999,997,440953.67 MiBほぼ同じ
フォーマット直後の空き965,021,696920.32 MiB−3.5%(管理領域)
一般ユーザーが使える分915,021,824872.63 MiB−8.5%(予約5%を引く)

1単位の差

1000進と1024進の違いで、GB なら約6.9%、TB なら約9.1%少なく見える。中身は減っていない。

2管理領域

ext4 の既定では、1GBのイメージで約3.5%が inode の表やジャーナルなどに使われた(Overhead clusters 8,533)。

3予約領域

ext4 は既定で5%(12,207ブロック)を管理者用に取っておく。一般ユーザーの df の Avail はその分少ない。

手元の仮想マシンでも、ディスク装置としての大きさ(lsblk -b)は274,877,906,944バイト=ちょうど256GiB、その上のファイルシステムの Size は270,553,174,016バイト(251.97GiB)で、約1.6%が管理領域でした。パソコンやスマホでは、さらに OS・回復用の領域・アプリが最初から使っている分も引かれます。Apple の公式サポートも、製品の箱にある「実際のフォーマット後の容量はこれより少ない」という注記を紹介しています。

メモリは1024進(free と /proc/meminfo)

この節では、メモリ(RAM)の容量がなぜ1024進で数えられるのか、Linux でどう表示されるのかが分かります。

メモリは、アドレスの線の本数で番地の数が決まるため、2の累乗の大きさで作られます。アドレスが32ビットなら番地は2の32乗=4,294,967,296個で、ちょうど4GiBです。32ビットの OS やプログラムで「4GB の壁」と言われるのはこの数です。このため、「16GBのメモリ」は正確には16GiB(17,179,869,184バイト)で、1000進で数えると17.18GBになります。Ubuntu の単位の方針(UnitsPolicy)も、RAM の大きさは2進(例:2 GiB RAM)、ディスクの大きさと通信速度は10進で書くと決めています。

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       836Mi       6.6Gi       237Mi       903Mi       7.0Gi
$ free -h --si
               total        used        free      shared  buff/cache   available
Mem:            8.4G        877M        7.1G        248M        947M        7.5G
$ head -1 /proc/meminfo
MemTotal:        8214984 kB

/proc/meminfo の「kB」は1024バイトの意味です。8,214,984 × 1024 = 8,412,143,616バイトで、free --si の8.4G と一致します(1000倍なら8.2Gになるはず)。procps-ng 4.0.4 の free -h は、1024進の値に「Gi」「Mi」と i を付けて表示していました。

「kB」を見たとき

思い込み表記が kB だから1000バイトだと決めて計算する
→
確かめるドキュメントか、別の表示(バイト数・--si)と突き合わせて、1000か1024かを確かめる

/proc/meminfo の kB・PostgreSQL の kB は、どちらも1024バイト

プログラミング言語・DBでの換算(Python・JavaScript・Java・Go・PHP・PostgreSQL)

この節では、プログラムでファイルの大きさを取得して GB・GiB に直す書き方と、言語ごとのつまずきが分かります。

どの言語も、ファイルの大きさはバイト数(整数)で返します。GB・GiB に直すのは自分の割り算で、標準の関数に「1024進の GB」を出すものはほとんどありません。500,000,000,000バイトのファイルを各言語で読みました。

Python

import os, shutil
SI  = ["B", "KB", "MB", "GB", "TB", "PB"]
IEC = ["B", "KiB", "MiB", "GiB", "TiB", "PiB"]

def human(n, binary=False):
    base, units = (1024, IEC) if binary else (1000, SI)
    i, v = 0, float(n)
    while v >= base and i < len(units) - 1:
        v /= base
        i += 1
    return f"{v:.2f} {units[i]}"

for n in (500 * 10**9, 10**12, 64 * 10**9, 16 * 2**30):
    print(f"{n:>16,} B  1000進={human(n):>10}  1024進={human(n, True):>11}")
print("getsize:", os.path.getsize("ssd500.img"))
u = shutil.disk_usage("/")
print("disk_usage total:", u.total, "=", human(u.total), "/", human(u.total, True))
 500,000,000,000 B  1000進= 500.00 GB  1024進= 465.66 GiB
1,000,000,000,000 B  1000進=   1.00 TB  1024進= 931.32 GiB
  64,000,000,000 B  1000進=  64.00 GB  1024進=  59.60 GiB
  17,179,869,184 B  1000進=  17.18 GB  1024進=  16.00 GiB
getsize: 500000000000
disk_usage total: 270553174016 = 270.55 GB / 251.97 GiB

JavaScript(Node.js)

const fs = require("fs");
const size = fs.statSync("ssd500.img").size;
console.log(size, "bytes");
console.log((size / 1e9).toFixed(2), "GB /", (size / 2 ** 30).toFixed(2), "GiB");
console.log(new Intl.NumberFormat("ja-JP",
  { style: "unit", unit: "gigabyte", maximumFractionDigits: 2 }).format(size / 2 ** 30));
console.log(2 ** 32, (2 ** 32) >>> 0, (2 ** 32) | 0);
500000000000 bytes
500.00 GB / 465.66 GiB
465.66 GB
4294967296 0 0

Intl.NumberFormat の unit には gigabyte はあっても gibibyte はありません。GiB の値を渡すと「465.66 GB」と表示され、Windows と同じ書き方になります。unit: "gibibyte" を指定すると次のエラーになりました。また、ビット演算(>>>・|)は32ビットで計算するため、4GiB(2の32乗)を通すと0になります。

RangeError: Invalid unit argument for Intl.NumberFormat() 'gibibyte'

Java

import java.nio.file.*;
public class Ds {
  public static void main(String[] a) throws Exception {
    long size = Files.size(Path.of("ssd500.img"));
    System.out.println(size + " bytes");
    System.out.printf("%.2f GB / %.2f GiB%n", size / 1e9, size / (double) (1L << 30));
    int i = (int) (4L * 1024 * 1024 * 1024);
    int j = 4 * 1024 * 1024 * 1024;
    System.out.println("(int)4GiB=" + i + "  int同士=" + j + "  long=" + (4L << 30));
  }
}
500000000000 bytes
500.00 GB / 465.66 GiB
(int)4GiB=0  int同士=0  long=4294967296

4 * 1024 * 1024 * 1024 は int どうしの掛け算なので、警告もなく0になりました。容量の計算では、最初の数を 4L のように long にします。

Go・PHP

package main

import ("fmt"; "os")

func main() {
	fi, _ := os.Stat("ssd500.img")
	s := fi.Size()
	fmt.Printf("%d bytes\n%.2f GB / %.2f GiB\n", s, float64(s)/1e9, float64(s)/(1<<30))
	var u uint32 = 1<<32 - 1
	u++
	fmt.Println("uint32 max+1 =", u)
}
500000000000 bytes
500.00 GB / 465.66 GiB
uint32 max+1 = 0
<?php
$s = filesize("ssd500.img");
printf("%d bytes\n%.2f GB / %.2f GiB\n", $s, $s / 1e9, $s / (1 << 30));
echo PHP_INT_SIZE, " ", PHP_INT_MAX, "\n";
500000000000 bytes
500.00 GB / 465.66 GiB
8 9223372036854775807

64ビットの PHP(PHP_INT_SIZE が8)では、500GBのファイルの大きさもそのまま整数で扱えました。Go の uint32 は最大値に1を足すと0に戻ります。4GiB を超えるファイルの大きさを32ビットの型に入れると、このように桁があふれます。

PostgreSQL の pg_size_pretty

SELECT pg_size_pretty(500000000000::bigint) AS a,
       pg_size_pretty(1073741824::bigint)   AS b,
       pg_size_pretty(1000000000::bigint)   AS c,
       pg_size_bytes('1 GB') AS d,
       pg_size_bytes('1 kB') AS e;
   a    |    b    |   c    |     d      |  e
--------+---------+--------+------------+------
 466 GB | 1024 MB | 954 MB | 1073741824 | 1024

PostgreSQL の kB・MB・GB は1024進です。500,000,000,000バイトが「466 GB」、1GiB が「1024 MB」と表示され、pg_size_bytes('1 GB') は1,073,741,824を返しました。公式ドキュメントも「単位は10の累乗ではなく2の累乗で、1kB は1024バイト」と明記しています。データベースの容量を報告するときは、この表示が1024進であることを添えると誤解を防げます。

設定ファイルの単位のつまずき(JVM の -Xmx・Kubernetes)

この節では、メモリの上限などを設定するときに、1000進と1024進の取り違えで何が起きるかが分かります。

設定ファイルの「g」「M」「Mi」は、ソフトごとに1000進か1024進かが決まっています。JVM の -Xmx を変えて、実際に設定された最大ヒープを見ました。

$ java -Xmx1g -XX:+PrintFlagsFinal -version | grep -w MaxHeapSize
   size_t MaxHeapSize                              = 1073741824
$ java -Xmx1000m -XX:+PrintFlagsFinal -version | grep -w MaxHeapSize
   size_t MaxHeapSize                              = 1048576000

JVM の 1g は1,073,741,824バイト(1GiB)、1000m は1,048,576,000バイトで、「1g」と「1000m」は同じではありません。

Kubernetes のリソースの量(Quantity)は、Ki・Mi・Gi・Ti・Pi・Ei が1024進、k・M・G・T・P・E が1000進です。公式の API リファレンスには「1024 = 1Ki だが 1000 = 1k」とあり、小文字の m は「ミリ(1000分の1)」です。メモリに 400m と書くと400MiB ではなく0.4バイトの意味になるため、メモリは 400Mi のように i 付きで書きます。

  1. 1そのソフトの公式ドキュメントで単位の定義を見るPostgreSQL の kB・JVM の g は1024進
  2. 2i 付き(Mi・Gi)が書けるなら i 付きで書くKubernetes・numfmt は i 付きで1024進と明示できる
  3. 3設定したあと、実際の値をバイト数で確かめる-XX:+PrintFlagsFinal・df -B1・ls -l など
  4. 4仕様書・報告にはバイト数か i 付きの単位を残す「16GiB(17,179,869,184バイト)」の形

よくあるつまずき(症状→原因→直し方)

この節では、容量の表示が合わないときに、症状から原因と直し方を引けます。

症状 原因 直し方・確かめ方
500GBのSSDが Windows で465GB Windows が1024進の値に GB と付けて表示 500,000,000,000 ÷ 1024³ = 465.66。故障ではない
計算より、さらに数%少ない ファイルシステムの管理領域・予約領域・回復用の領域 ext4 では1GBで約3.5%+予約5%を確かめた
同じディスクが df で 252G と 271G df -h は1024進、df -H は1000進 df -B1 でバイト数を見て比べる
dd の結果が「105 MB, 100 MiB」 bs=1M は1,048,576バイト 1,000,000バイト単位にするなら bs=1000000
Java で容量の計算が0になる 4 * 1024 * 1024 * 1024 が int であふれた 4L * 1024 * 1024 * 1024 のように long で計算
RangeError: Invalid unit argument … 'gibibyte' Intl.NumberFormat に gibibyte の単位は無い 数値だけ整形し、「GiB」は文字列で付ける
Kubernetes のメモリが極端に小さい 400m は0.4バイト(m はミリ) 400Mi と書く
DB の容量報告が他のツールと合わない pg_size_pretty の GB は1024進 バイト数(pg_database_size の値)で突き合わせる
100Mbpsなのに12MB/秒しか出ない 通信速度はビット(1バイト=8ビット) 100 ÷ 8 = 12.5MB/秒が上限の目安

通信速度の単位(Mbps)と MB/秒の換算、速度テストの結果の読み方は、関連記事「スピードテスト(Google)の結果の見方|下り・Pingの目安表と実測」で扱っています。通信速度は1000進(1Mbps=1,000,000ビット毎秒)で数えます。

1000進と1024進、どちらを使うかの判断表

この節では、資料・プログラム・設定で容量を書くときに、どちらの単位を選ぶかが分かります。

場面 使う単位 理由
ストレージの購入・見積もり1000進(GB・TB)製品の仕様が1000進で書かれている
メモリの容量1024進(GiB)メモリは2の累乗の大きさで作られる
通信速度・回線の容量1000進(Mbps・Gbps)通信は10進で数える決まり
Windows の画面の値を説明する1024進と書き添える画面の「GB」は中身が GiB
Kubernetes・コンテナのメモリ上限i 付き(Mi・Gi)1000進と書き分けられ、取り違えにくい
仕様書・API のフィールドバイト数(整数)単位の解釈が分かれない
ユーザーに見せるファイルの大きさOS の表示に合わせる同じ画面で数字が合わないと混乱する

ディスク容量の見積もり方(ログの増え方・バックアップの世代数から必要量を出す計算)は、関連記事「キャパシティ見積もりの計算方法|同時接続数・スループット・ディスク容量」で扱っています。見積もりの段階で1000進か1024進かをそろえておくと、購入する製品の容量と OS の表示の差(GB で約7%)を見込めます。Linux でメモリ・ディスクの使用量を見るコマンドは、関連記事「Linuxメモリ・ディスク確認|free・df・du・vmstat・iostat見方」にまとめています。

よくある質問

Q. 1GBは何MBですか? A. 1000MBです。1GB=1,000,000,000バイト、1MB=1,000,000バイトです。1024進で数えるなら、1GiB=1024MiB です。Windows の画面のように1024進の値に GB・MB と付けている場合は、1GB=1024MB として読みます。

Q. 1MBは何KBですか? A. 1000KBです(1MiB=1024KiB)。メールの添付やアップロードの上限が「1MB」とあるときは、サービスによって1,000,000バイトか1,048,576バイトかが違うので、境目の大きさを送るときはバイト数で確かめます。

Q. 1000と1024はどちらが正しいのですか? A. 国際規格では、KB・MB・GB は1000倍、KiB・MiB・GiB は1024倍です。ただし、1024進の値に KB・MB・GB と付けるソフト(Windows・PostgreSQL・/proc/meminfo など)もあるため、表示している側の決まりを確かめます。

Q. 1TBのHDDが931GBと表示されるのは故障ですか? A. 故障ではありません。1,000,000,000,000バイトを1024で3回割ると931.32になり、Windows はこれを「931GB」と表示します。さらに、フォーマットで管理領域の分が少し減ります。

Q. KiB・MiB・GiB は何と読みますか? A. キビバイト・メビバイト・ギビバイトです。TiB はテビバイト、PiB はペビバイトです。「キロ(kilo)+バイナリ(binary)」から「キビ(kibi)」という名前になりました。

Q. Mac と Windows で同じUSBメモリの容量が違うのはなぜですか? A. 計算のしかたが違うためです。現在の macOS は1000進(1GB=10億バイト)で表示し、Windows は1024進で計算した値に GB と付けて表示します。64GBのUSBメモリは、Mac で約64GB、Windows で約59.6GBと表示されます。

Q. メモリ16GBは16,000,000,000バイトですか? A. メモリの「16GB」は通常16GiB、つまり17,179,869,184バイトです。メモリは2の累乗の大きさで作られるため、1024進で数えるのが習慣です。

Q. 1バイトは何ビットですか? A. 8ビットです。通信速度の Mbps はビット毎秒なので、100Mbpsは毎秒12.5MB(1000進)が上限の目安です。記号は小文字の b がビット、大文字の B がバイトです。

Q. Linux で1000進の表示にするには? A. ls・du は --si、df は -H(--si)を付けます。-h は1024進です。numfmt なら --to=si が1000進、--to=iec-i が1024進(i 付き)です。

Q. プログラムでファイルの大きさを GB にするには? A. 言語の関数(os.path.getsize・fs.statSync・Files.size・os.Stat・filesize)でバイト数を取り、1000進なら10の9乗、1024進なら2の30乗で割ります。Java では 1L << 30 のように long で計算し、32ビットの型に入れないようにします。

まとめ

  • KB・MB・GB は1000ごと、KiB・MiB・GiB は1024ごとに単位が上がる。1GB=1,000,000,000バイト、1GiB=1,073,741,824バイト。
  • 差は桁が上がるほど広がり、GB で約6.9%、TB で約9.1%。500GBのSSDが Windows で約465GB、1TBのHDDが約931GBと表示されるのは、Windows が1024進の値に GB と付けているため。
  • 手元の Linux では、同じ500,000,000,000バイトが ls -lh で466G、ls -l --si で500G、PostgreSQL の pg_size_pretty で「466 GB」と表示された。
  • フォーマットすると、ext4 の既定で1GBあたり約3.5%の管理領域と5%の予約領域が引かれ、一般ユーザーが使える容量は製品表示から約8.5%少なくなった。
  • メモリは1024進、ストレージ製品と通信速度は1000進。設定や仕様書では i 付きの単位かバイト数で書くと取り違えない。

参考・出典

確認日:2026年11月7日

  • NIST「Prefixes for binary multiples」:https://physics.nist.gov/cuu/Units/binary.html
  • Microsoft Learn「Understand Azure Files billing」(Azure Files storage units):https://learn.microsoft.com/en-us/azure/storage/files/understanding-billing
  • Apple サポート「How storage capacity is measured on Apple devices」:https://support.apple.com/102119
  • GNU Coreutils Manual「Block size」:https://www.gnu.org/software/coreutils/manual/coreutils.html
  • Ubuntu Wiki「UnitsPolicy」:https://wiki.ubuntu.com/UnitsPolicy
  • PostgreSQL 16 Documentation「System Administration Functions」(pg_size_pretty・pg_size_bytes):https://www.postgresql.org/docs/16/functions-admin.html
  • Kubernetes「Quantity」:https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「データ容量の単位換算|KBとKiB・GBとGiBの違い(1000と1024)」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

成長のヒミツ、 ぜんぶ丸わかり