LoginSignup
3

More than 5 years have passed since last update.

ビッグエンディアン・リトルエンディアンって何なのか

Posted at

はじまり

floatデータをバイト配列から復元する必要があり、Arduinoのエンディアンはどっちなのだろうといつものgoogleにお世話になる。AVRのデータシート見ろは無しで。

参考:ビッグエンディアンとリトルエンディアンの狭

記事が古いがちょっと面白かった。分かってない人が見るとちんぷんかんぷんだ。Arduinoはリトルエンディアンと書かれているし、これ以上深入りしなくてもいいが。

深入りした結果

int ⇒ char 変換を考えると 4バイト ⇒ 1バイト。

ビッグエンディアンで 1000 番地から 0x12345678 を格納してみる。
1000 0x12 ⇒ 1000 0x12 (アドレス参照 の動き)
1001 0x34
1002 0x56
1003 0x78 ⇒ 1003 0x78 (キャスト の動き)

リトルエンディアンで 1000番地から 0x12345678 を格納してみる。
1000 0x78 ⇒ 1000 0x78 (アドレス参照・キャスト の動き)
1001 0x56
1002 0x34
1003 0x12

アドレス変化の無いリトルエンディアンが機械に優しい。また、TCP/IPなんかで使われるネットワークバイトオーダーは人間に優しいビッグエンディアン。ぱっと思いつくソースコードは下記。

#include <stdio.h>
int main(void) {
    unsigned long u32 = 0x12345678UL;
    printf(" char : %x\n", (char)u32);
    printf("*char*: %x\n", *(char*)&u32);
    return 0;
}

しまった。Arduino は printf が使えない。リトルエンディアンってことにしておこう。

余談

正直jsonやら何やら文字列表現してしまう環境の中、必要になる状況はあまりない。しかしQiitaにも多数投稿がある。プログラミング界の蟻地獄。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3