みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

エンディアン判定

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

エンディアン判定

投稿記事 by みけCAT » 14年前

実行したマシンがリトルエンディアンかビッグエンディアンかを判定するプログラムです。

CODE:

#include 
 
typedef union {
    int i;
    char c[sizeof(int)];
} findendian;
 
int main(void) {
    findendian fe;
    fe.i=1;
    if(fe.c[0])printf("リトルエンディアンです。\n");
    else printf("ビッグエンディアンです。\n");
    return 0;
}
実際にやってみたのがこちら。
http://ideone.com/aAuO8
http://codepad.org/PPPi8wlF

※ソースが間違っていたので修正しました。
if(fe.c)→if(fe.c[0])
それに応じて、URLも変更しました。
最後に編集したユーザー みけCAT on 2011年1月02日(日) 13:32 [ 編集 1 回目 ]
理由: バグがあったため修正

アバター
へろりくしょん
記事: 92
登録日時: 15年前

Re: エンディアン判定

投稿記事 by へろりくしょん » 14年前

int 型のバイト列を見るだけなら、

int x = 1;
if(*(char*)&x)....

でよいのでは。

ISLe
記事: 2650
登録日時: 15年前

Re: エンディアン判定

投稿記事 by ISLe » 14年前

実行時判定はバイエンディアンのCPU以外では絶対に実行することのないコードを抱えることになるので無駄が多いですよね。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: エンディアン判定

投稿記事 by みけCAT » 14年前

ISLe さんが書きました:実行時判定はバイエンディアンのCPU以外では絶対に実行することのないコードを抱えることになるので無駄が多いですよね。
といっても、そういうCPUがないとは言い切れないし...
make時に無効化できるようにする?いや、Linuxならまだしも、Windowsでmakeさせるのもどうかと思うし...
では、どうすればいいと思われますか?

ISLe
記事: 2650
登録日時: 15年前

Re: エンディアン判定

投稿記事 by ISLe » 14年前

みけCAT さんが書きました:といっても、そういうCPUがないとは言い切れないし...
ありますよ。PCの世界だと有名どころでも最近はあまり使われなくなってますけど。
でも世の中のCPUがリトルエンディアンとビッグエンディアンの2種類ですべて分類できるわけではないのでバイト並びとかcharサイズとかあらゆる組み合わせに対処しなければ中途半端ですよ。
みけCAT さんが書きました:make時に無効化できるようにする?いや、Linuxならまだしも、Windowsでmakeさせるのもどうかと思うし...
では、どうすればいいと思われますか?
既知のアーキテクチャに対しては定義済みマクロで切り替えれば良いと思います。
未知のアーキテクチャの場合はプリプロセッサでエラーメッセージを出力するほうがむしろ親切だと思います。