edubun
日本語

バイト、16進数と文字

文字Aは65、つまり01000001として記録されます。UTF-8では、U+D55Cのような韓国語の音節1つが3バイトになります。

まずは身近なパズルから。(これは作り話の例です。)ある生徒がチャットでKoreanという6文字の単語を打ちます。友だちは同じ単語を韓国語の文字で打ち、こちらは3音節です。大きいのはどちらのメッセージでしょう。たぶん予想とはちがいます。UTF-8で保存すると、英語の6文字は6バイトです。韓国語の3音節は1つ3バイトずつで9バイトです。UTF-8を定めた規格RFC 3629は、まさにこの単語を例の1つとして使い、そのバイトを書き出しています。ED 95 9C EA B5 AD EC 96 B4です。この差を説明するには2つのことが必要です。バイトを短く書く方法と、文字を数に変える取り決めです。

1バイトは16進数2桁

この文字と数字の組は16進数(hex)です。0と1の長い列は読みにくいので、プログラマーはこの略記を使います。16進数には16個の数字があります。0から9、そして10から15を表すAからFです。16進数1桁はちょうど4ビットにあたるので、1バイトはいつも16進数2桁です。01000001を0100と0001に分けます。それぞれ4と1なので、このバイトは0x41です。0xは「これは16進数」という印にすぎません。10進数では4 × 16 + 1 = 65です。

気づかないうちに16進数に出会っているかもしれません。Webページの色は、#RRGGBBと書かれることがよくあります。赤、緑、青の光にそれぞれ1バイトずつです(MDN)。#FF0000は真っ赤で、最初のバイトが255、残り2つが0です。#FFFFFFは白です。最大のバイト11111111は0xFFで、0xFF = 15 × 16 + 15 = 255です。

Aが65なのは、みんながそう決めたから

コンピューターは文字が何なのかをまったく知りません。数を記録し、どの数がどの文字を表すかをみんなが前もって取り決めておくのです。初期のネットワークで使われた取り決めがASCIIで、1969年にRFC 20がARPANET向けに定めました。ASCIIは7ビットを使うので、コードは128個です。大文字のAは65、Bは66と続き、Zは90です。小文字のaは97です。Aよりちょうど32大きく、ちがいはビット1つだけです。数字もコードです。文字の0は48なので、文字の「7」は数の7ではなく55として記録されます。

読み込み中

ドラッグで回転、スクロールまたはピンチで拡大・縮小。

スイッチは01000001、つまり文字Aを示しています。メニューから別の文字を選んで並びを見たり、32のスイッチを切り替えて大文字と小文字を行き来したりしてみましょう。

韓国語の音節に3バイト必要な理由

英語には128個のコードで十分ですが、韓国語、アラビア語、中国語、絵文字にはまったく足りません。Unicodeは世界の文字体系にあるすべての文字に、符号位置(コードポイント)と呼ばれる番号をU+10FFFFまで割り当てます。UTF-8(RFC 3629)はその番号をバイトに直すもっとも一般的な方法で、1文字に1から4バイトを使います。ASCIIの128文字は昔の1バイトのコードのままなので、ふつうの英語の文章はASCIIでもUTF-8でもまったく同じです。RFCの表では、U+0800からU+FFFFまでの符号位置はすべて3バイトの行にあり、韓国語の音節はこの範囲にあります。アクセントつきのéは2バイト、U+D55Cのような韓国語の音節は3バイト、😀のような絵文字は4バイトです。最初のバイトが長さまで知らせます。EDは11101101で、先頭の3つの1が、この文字は3バイトだと告げています。

文字符号位置UTF-8のバイト(16進数)バイト数
AU+0041411
aU+0061611
éU+00E9C3 A92
韓国語の音節(U+D55C)U+D55CED 95 9C3
😀U+1F600F0 9F 98 804

文字化けは、正しいバイトをまちがった取り決めで読んだもの

ふつうのテキストファイルは、これらのバイトが並んでいるだけで、ほかには何もありません。UTF-8で保存したHelloという単語は5バイトで、16進数では48 65 6C 6C 6F、10進数では72、101、108、108、111です。2つのlは同じバイトが2回です。では、そのファイルや韓国語のファイルを、まちがった取り決め、たとえばUTF-8ではなく古い韓国語や日本語の文字コードで開いてみましょう。プログラムはまったく同じバイトを別の文字として読みます。ファイルは何も壊れておらず、UTF-8で開き直せば文章は元に戻ります。

消えた34 GBの行方

2の10乗は1024で1000に近いため、長いあいだ「キロバイト」がその両方の意味で使われてきました。1998年12月にIECが別々の名前を承認し、NISTはそれを次のようにまとめています。1 kBは1000バイトですが、1 KiB(キビバイト)は1024バイトです。1 MBは1,000,000バイトですが、1 MiBは1,048,576バイトです。ドライブのメーカーは10の累乗で数えます。500 GBとして売られているドライブには500,000,000,000バイトが入ります。2の累乗で数えるOSは1,073,741,824で割り、約465.66 GiBと表示します。なくなったように見える約34は、もともと存在しなかったのです。2つの数は単位がちがうだけです。この差は単位が大きいほど広がります。KiBはkBより2.4%大きく、GiBはGBより約7.4%大きいのです。

よくある間違い
  • 「1 KBはどこでもちょうど1000バイトだ」 規格では、kBは1000バイトで、1024バイトはKiBです。実際には古い名前がいまもどちらの意味でも使われています。NISTによると、メモリのメーカーはふつうメガバイトを2²⁰バイトの意味で使い、記憶装置のメーカーは1,000,000の意味で使います。また、昔の「1.44 MB」のフロッピーディスクは、1,024,000バイトという3つ目のメガバイトを使っていました。正確な大きさが大事なときは、KiB、MiB、GiBのようにiがあるかを見ましょう。
  • 「500 GBのドライブが届いたら、34 GB足りなかった」 500,000,000,000バイト ÷ 1,073,741,824 ≈ 465.66 GiB。同じバイト数で、単位がちがうだけです。500 − 465.66 ≈ 34.34で、この差が「足りない」34です。
  • 「1文字はいつも1バイトだ」 UTF-8でそれが成り立つのはASCIIの128文字だけです。éは2バイト、韓国語の音節は3バイト、😀は4バイトなので、バイトで数える上限は、英語より韓国語の文章のほうが約3倍速くいっぱいになります。
  • 「文字の7は数の7として記録される」 文字の「7」はコード55、つまり00110111です。文章から「7」を読み取るプログラムは、計算に使う前にそれを数の7に変えなければなりません。
先生からひとこと定義からではなく、紙の上のバイトから始めましょう。Helloと書き、ASCII表で5つのコードをいっしょに調べ、そのあとで初めて16進数を見せます。学習者がつまずくのは16進数です。1バイトを8ビットで書かせ、真ん中に線を引き、半分ずつを1桁に直させましょう。そばには10 = A … 15 = Fの小さな表を置いておきます。Aとaのあいだの32は指摘する価値があります。シーンでビットを1つ切り替えると記憶に残るからです。コンピューターが手元にあれば、英語1行と韓国語1行をそれぞれUTF-8のテキストファイルとして保存し、ファイルの大きさを比べてみましょう。
  1. 0x41は10進数でいくつですか?
  2. 0xFFは10進数でいくつですか?
  3. 16進数1桁は何ビットを表しますか?
  4. ASCIIでAは65です。Cはいくつですか?
  5. aのコードはAのコードよりいくつ大きいですか?
  6. 7ビットのASCIIにはコードがいくつありますか?
  7. 韓国語の音節U+D55Cは、UTF-8で何バイトになりますか?
  8. 01000010として記録されている文字はどれですか?
    • B
    • A
    • b
    • 2
  9. 1 MiBは何バイトですか?
  10. あるドライブには500,000,000,000バイト入ります。約何GiBですか?(小数第1位まで)
ポイント
  • 16進数1桁 = 4ビット。1バイト = 16進数2桁(0x00から0xFF)。
  • ASCII:A = 65、a = 97、0 = 48。7ビットで128個のコード。
  • UTF-8は1文字に1から4バイトを使う。ASCIIの文章は変わらない。
  • 1 kB = 1000 B、1 KiB = 1024 B。1 MiB = 1,048,576 B。
このコースの出典 (9)
  • (checked 2026-10-17; reordered 2026-10-19: standards first, then official documentation, then the teaching model and calculations, history sources last)
  • Standards: NIST, "Prefixes for binary multiples" (physics.nist.gov/cuu/Units/binary.html: IEC approved kibi, mebi, gibi in December 1998; 1 B = 8 bit; 1 MiB = 1 048 576 B; 1 MB = 1 000 000 B; 1 GiB = 1 073 741 824 B; historical note: memory makers usually mean 2²⁰ bytes by megabyte, storage makers 1 000 000, and the "1.44 MB" diskette uses a megabyte of 1 024 000 bytes)
  • IETF RFC 20 "ASCII format for Network Interchange" (1969, 7-bit codes, A = 65, a = 97, 0 = 48)
  • IETF RFC 3629 "UTF-8, a transformation format of ISO 10646" (2003: 1 to 4 octets per character, ASCII unchanged, code points up to U+10FFFF, U+0800 to U+FFFF take three octets, "the first octet of a multi-octet sequence indicates the number of octets", example U+D55C U+AD6D U+C5B4 = ED 95 9C EA B5 AD EC 96 B4)
  • Official documentation: MDN Web Docs, "<color>" (hexadecimal colour notation #RRGGBB)
  • Intel, "Intel Chips" timeline poster (2012: Intel 4004 of 1971 with 2,300 transistors; 2nd generation Core 2010 with 1.16 billion)
  • Claude E. Shannon, "A Symbolic Analysis of Relay and Switching Circuits", Transactions of the AIEE vol. 57 (1938)
  • abstract of his MIT master's thesis. Computer History Museum, The Silicon Engine, "1947: Invention of the Point-Contact Transistor" (Bardeen and Brattain, December 1947, germanium)
  • John von Neumann, "First Draft of a Report on the EDVAC" (30 June 1945, Moore School, reprinted in IEEE Annals of the History of Computing 15:4, 1993).

確認日: 2026-10-17