レッスン
理論 — メモリとバイト:エンディアン・型・アドレス
バイトは8ビットからなり、0〜255の値を表します。メモリの各アドレスには一つのバイトが格納されます。それより大きな数には連続したアドレスを使い、32ビット整数なら4個必要です。こうしたバイトの並び順をエンディアンと呼びます。リトルエンディアンでは最も小さいアドレスに最下位バイトを置き、ビッグエンディアンでは最上位バイトを置きます。四つのバイトを符号なし整数として読むと、値はb₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³です。bₖは位kにあるバイトを表します。符号付き整数として読む場合、この合計が2³¹以上なら2³²を引きます。浮動小数点数として読む場合は、同じビット列をIEEE 754の規則で解釈します。
各記号の意味
bₖ- 位kにあるバイト。kは0(最下位)〜3
256ᵏ- その位の重み:1、256、65,536、16,777,216
- 前提
- 符号付き整数は2の補数、浮動小数点数はIEEE 754の単精度として扱います。現在のデスクトップやスマートフォンのプロセッサも、この方式です。テキストはASCIIで、一文字を一バイトで表します。現在、大半のファイルで使われているUTF-8では、一文字に最大四バイトを使います。
全プロセスの詳細解説
-
この画像の大きさは? 4 ステップ
PNGヘッダーを押してみましょう。表示されるのはPNGファイルの先頭24バイトです。PNGの仕様では、一バイトを超える整数はすべてビッグエンディアンと定められています。また、IHDRチャンクのデータは幅、高さの順に始まり、それぞれに四バイトを使います。幅と高さを求め、プログラムがリトルエンディアンで読んだ場合にはどんな大きさになるかも計算してみましょう。
-
ファイルの先頭には、89 50 4E 47 0D 0A 1A 0Aという八バイトの識別用の並びがあります。続く四バイトは最初のチャンクの長さをビッグエンディアンで表したもので、00 00 00 0Dは13です。その次がチャンクの種類を示す49 48 44 52で、文字として読むとIHDR。したがって、チャンクのデータはアドレス16から始まります。
-
幅はアドレス16〜19の00 00 01 E0です。ビッグエンディアンでは01が256¹の位、E0、つまり224が256⁰の位に入るので、256 + 224 = 480。このツールでアドレス16から読んでも、同じ値が表示されます。
-
高さはアドレス20〜23の00 00 01 0Eです。256 + 14 = 270になります。
-
リトルエンディアンでは、最後のバイトが最上位になります。幅は224 × 256³ + 1 × 256² = 3,758,161,920、高さは14 × 256³ + 256² = 234,946,560です。
解答
480 × 270ピクセルです。同じバイト列をリトルエンディアンで読むと、3,758,161,920 × 234,946,560、約8.83 × 10¹⁷ピクセルという大きさになります。一ピクセルに四バイトを使うなら、3.53 × 10¹⁸バイトです。バイト順が書かれているのはファイルではなく仕様書なので、プログラムにはその順序を指定する必要があります。
-
学習の道すじ
コンピュータはどうやってプログラムを動かすのか
参考文献 (2)
- Where the names little-endian and big-endian come from, and the date the first insight gives: Danny Cohen, "On Holy Wars and a Plea for Peace." Internet Experiment Note IEN 137, 1 April 1980.
- The worked problem's file: the signature bytes, network byte order for every multi-byte integer, and the IHDR fields in order: W3C, "Portable Network Graphics (PNG) Specification (Third Edition)." W3C Recommendation, 24 June 2025.