質問: __BIG_ENDIAN unsigned int version:4; unsigned int ihl:4; #else # error "Please fix " #endif ``` Linux環境 /usr/include/netinet/ip.h より抜粋(IPv4のヘッダ部分の一部) 上のコード(ヘッダ部分)を見ると、ホストがリトルエンディアンかビックエンディアンかによって、 IHLフィールドとVersionフィールド(IPヘッダのフォーマット)を定義する順序が逆になっています。 エンディアンはバイトの並び方であり、これらの2つのメンバはビット単位で割り当てられているので、この例においてリトルエンディアンの場合、割り当ての順序を逆にしなくても良いと思ったのですが... ~~エンディアン(バイトオーダ)といえば、メモリに格納されるバイトの順序のことですが、 どうやら上のIPのヘッダの例を見てみるとその定義はおかしいような気がするのです。 参考にした文献→エンディアン - Wikipedia~~ 分かる方がいらっしゃいましたらご回答お願いします。
回答: > > unsigned int ihl:4; > > unsigned int version:4; > > > この定義は、unsigned int の中の4ビット分、ということですが、この4ビットをMSB側から取るのか、LSB側から取るのか、というのは、実は実装依存、ということになってます コンパイルオプションでこの順序を変えることはできますが、 一般的にデフォルトの値として、BIGEndianのときとLITTLEEndianのときとではそういう順序になってる、ということなんでしょう。