• 締切済み

そもそも何故、2つのエンディアンが存在するのでしょう?

CPUのエンディアンにはリトルエンディアンとビッグエンディアンの2種がありますが,そもそも何故2つのことなるエンディアンが存在するのでしょうか。 同じようなタイミングで2つの有力な規格が現れたのでしょうか。誰か教えてください。

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.5

それぞれに利点があったはずですが、忘れました(^^; 個人的には,プログラム作る場合はビッグの方が簡単で分かりやすいですね。 あと、インテルの86x80系のCPU以外は, 設定しだいで両方使えるのが多いようです。 PowerPC,MIPS,Alphaなど・・・。 インテルでも86x80系でないと、そういう石があります。 確かPowerPC用NTは、リトルエンディアンのモードで動いていたはず。 また、TCP/IP系のネットワークでは全てビッグエンディアンのデータになっていますね。

回答No.4

「そもそも モトローラとザイログ、インテルが火付け役なんでしょうか。 」 偶々、メジャーどころをあげただけなのでそこら辺は昔の本でも引っ張り出せば 分かるんだろうけど。どうなんでしょう? 「ではなぜ、インテルはあえてリトルエンディアンを採用したかというのは、その優位性を買ってのことなんでしょうか。 」 あえて採用したんでなくSISCチップの86系って元々シェア的に 優位だったんじゃ・・・。 モトローラ系の6800や68000って後発で追い上げてるって状況 だったような。 当時(現在もそうだと思いますが)は86系がのっているAT互換機とEWS等との 絶対数を比べるとAT互換機が多かったと思いますが。 「どちらのエンディアンにも良いところはあるのはわかりますが、決定的にどちらが良い、ということはないのですね。 」 それは、自分に聞くより説明なされているzohさんに聞いた方が・・・。 決定的にどちらが良いですか。白黒付ける必要があればそうですけど。 あと、何をもって決定打とするかにもよるし。 はやさなら、インテル系ってペンティアムシリーズあたりからRISC化したけど モトローラ系のCPUの方が早いんじゃなかったっけ?

  • h_sakaki
  • ベストアンサー率18% (175/970)
回答No.3

先の方々とほぼ同じですが、 インテルの場合8080(8085・Z80)のソフトのしがらみ(互換性を重視した)8086/8088を作り そのまま286→386→ペンテイアム になり、リトルエンディアンのまま引きずっています。 モトローラは 68000で6802/6809のしがらみを、あっさり捨ててしまいました。(当時のソフト屋さんは勉強のし直し)それで、ビッグエンディアンが採用できたのです。 ROMをダンプすると、インテル系のは頭が混乱しますが、慣れです。

  • zoh
  • ベストアンサー率34% (273/789)
回答No.2

スタックに押し込む順番の問題と、ワードで見たときの扱いやすさ、この辺が確かそれぞれの言い分だったような… どっかに詳しく解説した資料があったんだが…ちょっと見つかりません。 アスキー出版の「近代プログラマの夕(ゆうべ)」シリーズにも、どこかに詳しく載っています。ホーテンス・S・エンドウ/著の名作です。 >同じようなタイミングで2つの有力な規格が 8bitから16bitへの進化が同じ頃になったからでしょう。きっと。

jiro2k
質問者

お礼

もともとはどちらも主張があって、それらがそのままどちらも発展し使われてきたということでしょうか。 プログラマの言い分を聞くというのは良手みたいですね。非常に参考になりました、ありがとうございます。

回答No.1

御存知の通り CPUには有名どころでは ザイログやインテル、モトローラありますよね。 (日本にもいいRISCチップが沢山ありますけど、ここでは置いておいて。) SUNやアップルはモトローラ系を IBM(AT-PC,AT互換機)がインテルやザイログを採用したから じゃないかと考えますが。 (86系はローハイ交換して68系はそのままだから。)

jiro2k
質問者

お礼

そもそも モトローラとザイログ、インテルが火付け役なんでしょうか。 ではなぜ、インテルはあえてリトルエンディアンを採用したかというのは、その優位性を買ってのことなんでしょうか。 どちらのエンディアンにも良いところはあるのはわかりますが、決定的にどちらが良い、ということはないのですね。 各々の源CPUの誕生した背景を調べてみるとよさそうですね。どうもありがとうございます。

関連するQ&A

  • リトルエンディアン、ビッグエンディアンについて

    リトルエンディアン、ビッグエンディアンについて 質問があります。 (1)簡単にそのPCがリトルエンディアンなのか、ビッグエンディアン  なのか、分かる方法はありますか?  簡単なCプログラムを書いてメモリ状態をダンプするのが、  一番早いのでしょうか?  それとも、Intel系?モントローラ系?CPUにはあまり詳しくないので、  分かりませんが、これらのどちらかに属していれば決められるので  しょうか?ほかの系とかあるのかな・・・ (2)ネットワークプログラミングをするときに、ビッグエンディアンの  マシンからデータを送出する場合には、htonlなどの関数を使用しなく  ても問題ありませんでしょうか?(ネットワークバイトオーダが  ビックエンディアンであるため)

  • エンディアンについて。

    リトルエンディアンとビッグエンディアンそれぞれのメリット・デメリットを教えて下さい。

  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? CPUはリトルです。 まず、エンディアンの違いについては 以下のように認識しています。 x = 0xAABBCCDD メモリの配置方法が、 トリルだと DD CC BB AA ビックだと AA BB CC DD だと思っています。32ビットの場合です。 で、これを変換するには、htonlで変換可能だと思っっています。 (試したところ可能でした) で次に、32ビットを超えるデータ、たとえば100バイトとかを mallocにして変数に代入しました。 この時はエンディアン変換(ファイルに出力する際)は必要ないのでしょうか? 試しに出力すると、 x = 0x AA BB CC DD EE FF GG ・・・・・・ZZ (100バイトと仮定) バイナリでの出力結果は AA BB CC DD EE FF GG ・・・・・となっていました。 私の認識だと、本CPUはリトルエンディアンのため、 ZZ ・・・・・・・・ DD CC BB AA (四バイトずつ反転しているデータ) が出力されるものと思っていました。(反転してメモリに格納されるため) リトル/ビックを意識しないといけないのは、 2バイトや4バイトの時のみで、それを超える大きなデータ(100バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。

  • エンディアンを知るには

    リトルエンディアンのマシンで作ったバイナリデータをいろいろなマシンで読み込みたいのですが、一部がビッグエンディアンなので変換の必要があります。ただ、ソースを共通にしたいのでエンディアンを知ることができるマクロの値でエンディアンの違いの処理を行いたいのですが、どのようなマクロを使えばいいのでしょうか?

  • リトルエンディアン形式、ビッグエンディアン形式

    仕事上でリトルエンディアン形式、ビッグエンディアン形式を使う?のですが意味がまったく解りません 簡単に言ったら JPEGで容量:1.5M、サイズ:640x640、リトルエンディアン形式 JPEGで容量:1.5M以上、サイズ:639x639、ビッグエンディアン形式 となっています 何をどうすればイイのでしょうか? 初めてなので戸惑ってます ちなみにこの作業はコンテンツ作成です

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • 最近のCPUのほとんどはリトルエンディアンかビッグエンディアンでしょうか?

    2000年あたり以降に出た Windows, Mac, Linuxに使われているCPUのほとんどはリトルエンディアンかビッグエンディアンでしょうか? また、たとえば以下のような方法でエンディアンを調べられると考えていいのでしょうか?(VC++です) #include <windows.h> void GetEndian4(char* c){ unsigned __int32 a=0x03020100; BYTE *b = (BYTE*)&a, i=4; while (i--) c[i]=b[i]; } ////////// const char e[4]={}; GetEndian4( const_cast<char*>(e) ); //eが 0,1,2,3 になればリトルエンディアン //3,2,1,0 になればビッグエンディアン //PDP-エンディアンだと 2,3,0,1 …のはず (または2択ならこれだけでも判断可能…?) short s=1; printf( *(char*)&s ? "リトルエディアン\n" : "ビッグエディアン\n" ); あとここでもアラインメントの問題が絡みますが、このように アラインメントが(2のべき乗だとして)大きいであろう方から小さいであろう方にキャストする分には安全で、逆に sizeof(short) == sizeof(char)*2 として char c[2]={1,0}; short s=*(short*)&c; というのは危険な場合がある、ということでしょうか? また、その場合は たとえばビッグエンディアンなら short s=(c[0]<<8)|c[1]; とすればいいでしょうか?

  • ビックエンディアンで動作するPC

    バイトオーダでビックエンディアンとリトルエンディアンがあるのは知っていますが、 実際にビックエンディアンで動作するPCを見たことがありません。 (といいますかビックエンディアンで動作しているか分かりません) 秋葉原等でビックエンディアンで動作するPC(CPU・マザーボード)は買うことはできるのでしょうか? その場合のOS、Linuxになると思いますがディトリビューションどれがよいのでしょうか? クロスコンパイル環境に興味があり、エンディアンが違うPCでも動作するプログラムを 書いてみたいと興味があり質問させていただきました。

  • ビッグ/リトルエンディアンについて

    現在、ワークステーション(SPARC+Soralis)上でFortranで書かれたプログラムがあります。 それをPC(x86+WindowsXP)の環境へ移行した所、Fortran記録(バイナリ)の内容が、CPUアーキテクチャの絡みでビックエンディアン/リトルエンディアンの問題が発生し、苦労しています。 Windows側で使用しているFortranコンパイラは「富士通 Fortran&C Packege V4.0」です。 PC側でまともにワークステーションのバイナリファイルを読みたいのです。 どなたか対策をご存じの方がいらっしゃいましたら、ぜひ、ご教授ください。 よろしくお願いいたします。

  • Javaでのエンディアン変換

    こんばんは☆ Javaでのエンディアン変換をご教授ください。 ファイルを読み込み、ソケット通信でサーバへデータ送信しています。 リトルエンディアンで送らなければいけないのですが、 Javaはプラットフォーム問わずにビッグエンディアンでメモリに格納するとありました。 そこで、バイトオーダーをしようと思い、 stirlingというバイナリエディタでバイナリファイルを作成して以下の2点で試しました。 <バイナリファイル構造体> struct stest { LONG l1; LONG l2; LONG l3; LONG l4; }; <バイナリデータ(数値)> 1234 (010000020000030000040000)←バイナリエディタで見たとき <テスト1結果> ・・・new InputStreamReader(in, "UnicodeLittle"); >1000200030004000 <テスト2結果> ByteBuffer buffer = ByteBuffer.wrap(bt); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.get(); >1000200030004000 これはリトルエンディアンなのでしょうか? どちらも、 Javaで読み込み時にエンディアン指定しない時と出力結果に違いがありませんでした。 なぜでしょうか? ちなみに、データ型を意識せずに変換したいです。 色々と調べたのですが、良く分かりません。 どなたかご教授お願いいたしますm(_ _)m

    • ベストアンサー
    • Java