応用情報技術者 2011年 春期 午前2 問11
問題文
主記憶の 1000番地から、表のように4バイトの整数データが格納されている。これを32ビットのレジスタにロードするとき、プロセッサのエンディアンとレジスタにロードされる数値との組合せとして、正しいものはどれか。


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
エンディアン(バイト順序)【午前2解説】
正解の理由
メモリ上に並んだバイト列 1000:00、1001:01、1002:02、1003:03 を32ビット整数としてレジスタにロードする際、エンディアンによってバイトの並び(どのバイトが最下位か最上位か)が変わります。
リトルエンディアンでは低位バイトが低アドレスに置かれるためメモリ順(00 01 02 03)は整数値 となり、ビッグエンディアンでは高位バイトが低アドレスに置かれるため同じメモリ順からは整数値 になります。
この組合せを示している選択肢が エ なので、エ が正解です。
リトルエンディアンでは低位バイトが低アドレスに置かれるためメモリ順(00 01 02 03)は整数値 となり、ビッグエンディアンでは高位バイトが低アドレスに置かれるため同じメモリ順からは整数値 になります。
この組合せを示している選択肢が エ なので、エ が正解です。
(重要)エンディアンは「バイトの並び順を決める規則」であり、同一のメモリ上のバイト列を異なるエンディアンで解釈すると、得られる整数値は異なります。エンディアンの違いで数値の意味や大小が変わるのではなく、解釈(並び替え)を変えると結果として得られる数値が変わる、という点を押さえてください。
解法ステップ
- メモリ上のバイト列を確認する(低アドレス→高アドレス): 00, 01, 02, 03。
- リトルエンディアンの組立て:
- リトルエンディアンでは最低位バイト(バイト0)が最も低いアドレスに置かれる。したがってメモリ順 00(b0), 01(b1), 02(b2), 03(b3)をそのまま b0..b3 とみなす。
- 整数表現は b3 b2 b1 b0 = 03 02 01 00 → 。
- ビッグエンディアンの組立て:
- ビッグエンディアンでは最高位バイト(b3)が最も低いアドレスに置かれる。メモリ順 00,01,02,03 は b3=00,b2=01,b1=02,b0=03 と見なす。
- 整数表現は b3 b2 b1 b0 = 00 01 02 03 → 。
- 各選択肢の記述と照合して、リトル=、ビッグ= を示すものが正しいと判断する。
補足計算(10進数):
選択肢別の誤答解説
- ア: リトルが 00010203、ビッグが 02030001 とあるが、実際のメモリ順 00 01 02 03 をリトルとしてそのまま 00010203 とするのは、リトルエンディアンの定義(低位バイトが低アドレス)を誤認している。リトルでは 03020100 が正しい。
- イ: リトルが 00010203、ビッグが 03020100 とある。これもリトルとビッグを逆に扱っている(リトルとビッグの並び規則が入れ替わっている)。
- ウ: リトルが 02030001、ビッグが 00010203 とある。ビッグ側は正しいが、リトル側の値が誤り(バイト並びを誤って逆にしている)。
- エ: リトルが 03020100、ビッグが 00010203 とあり、前述の手順で導かれる値と一致するため正しい。ここが正解である。
よくある誤解
- 「エンディアンは見た目だけの違いで数値は変わらない」 — 誤り。エンディアンはバイトの並び順を決める規則で、同一のメモリバイト列を別のエンディアンで解釈すると得られる整数値は異なります(つまり解釈が変わると値が変わる)。
- 「アドレスが小さい方が常に上位か下位か混同する」 — メモリのアドレスの増加方向と数値の上位・下位の関係を正確に区別すること。リトルは低アドレスに低位バイト、ビッグは低アドレスに高位バイト。
- 「バイト順とビット順を混同する」 — エンディアンは主にバイト単位の順序。ビットオーダ(同一バイト内のビット順)は別の概念で通常はあまり意識しないが混同しないこと。
補足コラム
- 実際のプログラミングで確認する簡単な方法(Python):
data = bytes([0x00, 0x01, 0x02, 0x03])
print(hex(int.from_bytes(data, 'little')), int.from_bytes(data, 'little'))
print(hex(int.from_bytes(data, 'big')), int.from_bytes(data, 'big'))
# 出力: 0x3020100 50462976
# 0x10203 66051
- ネットワークバイトオーダーはビッグエンディアン。x86系CPUはリトルエンディアンが多い。
- 符号付き整数として解釈する場合は最上位ビット(符号ビット)がどこに来るかが変わるため、符号解釈にも影響する。
FAQ
Q: 同じメモリのバイト列を別のエンディアンで読み替えることは可能か?
A: 可能です。ソフトウェアでバイト順を入れ替える変換(バイトスワップ)を行えば、別エンディアンの表現を得られます。Cでは ntohl/htonl 等の関数、Pythonでは int.from_bytes / to_bytes を使います。
A: 可能です。ソフトウェアでバイト順を入れ替える変換(バイトスワップ)を行えば、別エンディアンの表現を得られます。Cでは ntohl/htonl 等の関数、Pythonでは int.from_bytes / to_bytes を使います。
Q: エンディアンはCPUごとに固定ですか?
A: 多くのCPUはハードウェアで固定(例: x86はリトル)、ただし一部のCPU(例: ARMの旧世代)では動作モードで切り替えられる場合があります。OSやプロトコルによる変換が一般的です。
A: 多くのCPUはハードウェアで固定(例: x86はリトル)、ただし一部のCPU(例: ARMの旧世代)では動作モードで切り替えられる場合があります。OSやプロトコルによる変換が一般的です。
Q: 受験での短い覚え方は?
A: 「リトル=リトル(低)アドレスにリトル(下位)バイト」。語呂合わせで「低アドレス=低位(リトル)」が覚えやすいです。
A: 「リトル=リトル(低)アドレスにリトル(下位)バイト」。語呂合わせで「低アドレス=低位(リトル)」が覚えやすいです。
関連キーワード: エンディアン、リトルエンディアン、ビッグエンディアン、バイト順序、バイトスワップ、メモリ配置、htonl、ntohl

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

