ビッグエンディアンとリトルエンディアンの違い

ビッグエンディアンとリトルエンディアンの違いを紹介します。

概要

計算機のCPUにはデータの格納方式の違いにより、ビッグエンディアンとリトルエンディアンの2種類があります。
この記事では、プログラム例を紹介しながら、ビッグエンディアンとリトルエンディアンの違いを紹介します。

プログラム例1 : 整数

Windowsで次のプログラムを作成します。C#のコードを例にしています。

コード(C#)

namespace EndiannessTestConsole
{
  internal class Program
  {
    static void Main(string[] args)
    {
      int value = 0x1A2B3C4D;
      byte[] ba = BitConverter.GetBytes(value);

      for (int i = 0; i < 4; i++) {
        Console.WriteLine("[{0:d}] : {1:X}", i, ba[i]);
      }

    }
  }
}

解説

value変数に 0x1A2B3C4E の値を代入し、その値を BitConverter.GetBytes()を利用してバイト配列に変換しています。
変換したバイト配列の値を画面に出力しています。

実行結果

プログラムを実行すると以下の結果になります。

ビッグエンディアンとリトルエンディアンの違い:画像1

[0] : 4D
[1] : 3C
[2] : 2B
[3] : 1A

コード(C言語)

#include <iostream>

int main()
{
  int value = 0x1A2B3C4D;
  unsigned char bytes[sizeof(int)];

  for (int i = 0; i < sizeof(int); i++) {
    bytes[i] = (value >> (i * 8)) & 0xFF;
  }

  for (int i = 0; i < sizeof(bytes); i++) {
    printf("[%d] : %02X\r\n", i, bytes[i]);
  }
}

解説

value変数に 0x1A2B3C4E の値を代入し、その値を "0x000000FF" でマスクしてunsigned char 変数(バイト型)の配列の最初の要素に代入します。 その後8ビット右にシフトして、"0x000000FF" でマスクしてunsigned char の次の配列の要素に代入します。同様に2回繰り返し、int型の変数を4つのunsigned char 変数に 代入します。

変換したunsigned char配列の値を画面に出力しています。

実行結果

プログラムを実行すると以下の結果になります。

ビッグエンディアンとリトルエンディアンの違い:画像2

[0] : 4D
[1] : 3C
[2] : 2B
[3] : 1A

ビッグエンディアンとリトルエンディアン

今回のプログラムはWindowsのintelのCPUで実行しています。0x1A2B3C4E の32ビット整数値の場合、一番最初のバイトは 4D となり、一番下の桁が最初のバイトになります。 この並びがリトルエンディアンになります。ビッグエンディアンのアーキテクチャの場合は、逆に一番最初のバイトが一番上位の桁になります。
表にすると下図になります。

0x1A2B3C4E のバイトオーダー
方式 byte[0] byte[1] byte[2] byte[3]
リトルエンディアン 0x4D 0x3C 0x2B 0x1A
ビッグエンディアン 0x1A 0x2B 0x3C 0x4D


0x1A2B3C4E のビット表記
方式 ビット
リトルエンディアン 0100 1101 0011 1100 0010 1011 0001 1010
ビッグエンディアン 0001 1010 0010 1011 0011 1100 0100 1101

プログラム例2 : IPアドレス

Intel CPUではリトルエンディアンですが、IPアドレスのバイトオーダーはビッグエンディアンです。 IPアドレスのバイトオーダーを確認します。

using System.Net;

namespace EndiannessTestConsoleIP
{
  internal class Program
  {
    static void Main(string[] args)
    {
      IPAddress ip = IPAddress.Parse("192.168.0.100");
      byte[] bytes = ip.GetAddressBytes();

      for (int i = 0; i < 4; i++) {
        Console.WriteLine("[{0:d}] : {1:X}", i, bytes[i]);
      }
    }
  }
}

解説

IPAddress オブジェクトに 192.168.0.100 のアドレスを設定し、GetAddressBytes() メソッドを呼び出して4バイトのバイト配列に変換します。
変換したバイト配列の値を画面に出力しています。

実行結果

プログラムを実行すると以下の結果になります。
.で区切られているため、違和感はあまりないですが、int型の整数値とは異なり、上位の桁が先頭のバイトになっていることがわかります。

ビッグエンディアンとリトルエンディアンの違い:画像3

[0] : C0
[1] : A8
[2] : 0
[3] : 64
192.168.0.100 のバイトオーダー
byte[0] byte[1] byte[2] byte[3]
0xC0 0xA8 0x00 0x64


ビッグエンディアンのため、ビットは上位の値で左から始まります。

192.168.0.100 のビット表記
1100 0000 1010 1000 0000 0000 0110 0100
AuthorPortraitAlt
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
作成日: 2024-05-25
Copyright © 1995–2025 iPentec all rights reserverd.