
リトルエンディアン、ビッグエンディアンについて
質問があります。
(1)簡単にそのPCがリトルエンディアンなのか、ビッグエンディアン
なのか、分かる方法はありますか?
簡単なCプログラムを書いてメモリ状態をダンプするのが、
一番早いのでしょうか?
それとも、Intel系?モントローラ系?CPUにはあまり詳しくないので、
分かりませんが、これらのどちらかに属していれば決められるので
しょうか?ほかの系とかあるのかな・・・
(2)ネットワークプログラミングをするときに、ビッグエンディアンの
マシンからデータを送出する場合には、htonlなどの関数を使用しなく
ても問題ありませんでしょうか?(ネットワークバイトオーダが
ビックエンディアンであるため)
No.3ベストアンサー
- 回答日時:
(1)
エディアンの判定プログラム
short s;
char *cp;
s=1;
cp=(char *)&s;
if (*cp) {
printf("リトルエディアン\n");
} else {
printf("ビッグエディアン\n");
}
(2)
移植性を考えるなら「実行環境がどうであっても、ネットワークに送出する段階で、ビッグエディアンでデータを並べるようにコーディングする」のが良いでしょう。
つまり、リトルエディアン、ビッグエディアンどちらのマシンでコンパイル&実行しても、ビッグエディアンでデータを送出するように書く事になります。
言い換えれば「リトルエディアン環境でコンパイル&実行するとビッグエディアンに変換し、ビッグエディアン環境でコンパイル&実行すると何もしない」と言う事です。
そして「リトルエディアン環境でコンパイル&実行するとビッグエディアンに変換し、ビッグエディアン環境でコンパイル&実行すると何もしない関数」が「htonl関数そのもの」なのです。
まとめると「移植性を考えるなら、htonl関数が何もしないと判った上で、htonl関数を呼ぶ」と言う事です。
で、ビッグエディアンのマシン用のコンパイラは、htonl関数は
#define htonl(a) (a)
とかって定義してあったりして「マジに何もしない」ようになってたりします(笑)
ご回答ありがとうございます。
コンパイルの時点で、エンディアンを変換するか
どうかが決まるのですね。実行時に決まるのかと
思っていました。
エンディアンが異なっても、ソース互換があるという
ことですね。(バイナリ互換ではない)
勉強になります。
No.4
- 回答日時:
追記。
当方の回答で
「リトルエディアン環境でコンパイル&実行するとビッグエディアンに変換し、ビッグエディアン環境でコンパイル&実行すると何もしない関数」が「htonl関数そのもの」
と言いました。これは「送出時の観点」から書いた物です。
「受信時の観点」から書けば
「リトルエディアン環境でコンパイル&実行すると、ビッグエディアンからリトルエディアンに変換し、ビッグエディアン環境でコンパイル&実行すると何もしない関数」が「ntohl関数そのもの」
となります(関数名が違う事に注意)
つまり
「送出時は、htonl関数を呼んで送出する」
「受信時は、受信してからntohl関数を呼ぶ」
と言う事になります。
そういう訳で、htonl関数、ntohl関数とは「ネットワークバイトオーダーとローカルバイトオーダーを変換する関数のセット」と言う事になります。
そしてこれは「htonl関数、ntohl関数を呼んでさえおけば、実行するマシンが、リトルエディアンかビッグエディアンか気にする必要はない」と言う事を意味します。
この「実行するマシンが、リトルエディアンかビッグエディアンか気にする必要はない」と言うのが、ANo2の方が書いた
>htonlを使った方が、簡単なはずです。
の「簡単」の意味です。
No.2
- 回答日時:
> (1)簡単にそのPCがリトルエンディアンなのか、ビッグエンディアン
> なのか、分かる方法はありますか?
リトルエンディアン・ビッグエンディアンがどう言ったものであるか
理解しているなら、その判別プログラムも簡単に書ける事でしょう。
分からない場合は、ウェブで調べると良いです。
たぶん、すぐ見つかります。
・Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3% …
> (2)ネットワークプログラミングをするときに、ビッグエンディアンの
> マシンからデータを送出する場合には、htonlなどの関数を使用しなく
> ても問題ありませんでしょうか?(ネットワークバイトオーダが
> ビックエンディアンであるため)
htonlなどの関数を使わなくても、ネットワークプログラミングをする事は、
可能では、ありますが、htonlを使った方が、簡単なはずです。
参考までにサンプルコードを挙げてみます。
----------------------------------------------------------------------
#include <stdio.h>
int main(int argc, char *argv[])
{
union
{
unsigned short shortValue;
unsigned char charValue[2];
} endianTest;
endianTest.shortValue = 0x0102;
if (endianTest.charValue[0] = 2)
{
printf("is LittleEndian\n");
}
else
{
printf("is BigEndian\n");
}
return 0;
}
----------------------------------------------------------------------
エンディアンの判別プログラムは、こんな感じです。
この回答への補足
ご回答ありがとうございます。
判定プログラムありがとうございます。
すごく分かりやすいです。
一点質問なのですが、
>htonlを使った方が、簡単なはずです。
これは具体的にはどのような意味なのでしょうか?
No.1
- 回答日時:
Intel だけど Itanium はバイエンディアン (つまりビッグエンディアン, リトルエンディアンのどっちも使える) です. 他にもいくつかバイエンディアンの CPU があったような気がする. 極端なやつだと「プロセスごとにエンディアンが決められる」ものすらあったような....
ということで, ビッグエンディアンと決めつけるのは危険だと思います.
ご回答ありがとうございます。
>ビッグエンディアンと決めつけとるのは危険だと思います.
将来の移植なども考慮すると、常にhtonlなどを使用して
プログラミングしたほうがよいかもしれないですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) x86_32ビットアセンブラ 2 2023/06/28 17:50
- その他(パソコン・スマホ・電化製品) PCに詳しい方に、質問です。 使用しているのは、TOSHIBAのPCで、多分なんですけど、アップデー 4 2023/01/28 03:30
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- ノートパソコン このノートパソコンで大丈夫でしょうか? 2 2023/04/22 21:01
- C言語・C++・C# PCの性能とビルド時間 4 2022/11/14 19:23
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Windows 10 どうしたらパソコンに詳しくなれる?? 5 2022/04/04 19:09
- ドライブ・ストレージ 複数のパソコンが自宅にあり、互いの固有のHD、光学ドライブを相互にアクセスする方法。その2 3 2022/12/16 09:54
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- その他(プログラミング・Web制作) プログラミング能力とアルゴリズム能力って違うのでしょうか? プログラミングの能力の一部にアルゴリズム 10 2023/03/31 14:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
ヘッダーファイル『windows.h』...
-
実行ファイルが作成環境以外のP...
-
vba コンパイル
-
MinGWでのリンク
-
define文のパラメータを実行時...
-
cygwin1.dll を必要としないCの...
-
AdobeReader8.0の機能を使って...
-
シリアル通信の受信待ちについて
-
gccコンパイル時のエラーメッセ...
-
libsshのコンパイルエラー
-
Verilog_HDLでのdefineとifdef
-
C# exeファイルのダブルクリック
-
gcc コンパイル killed
-
MacでのC言語について
-
math.hに含まれる関数が使えない
-
実行後にコンパイルに失敗しま...
-
64ビットのlinuxで32ビットメモ...
-
NASMとMASMの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
シリアル通信の受信待ちについて
-
ビープ音が鳴りません・・・
-
C#で char型とstring型の比較で...
-
c言語です コンパイルした時に...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
64ビットのlinuxで32ビットメモ...
-
C言語で作ったらWindowsでもMac...
-
MS-BASICの逆コンパイルについて
-
<math.h>ヘッダを入力している...
-
ヘッダーファイル『windows.h』...
-
プレコンパイルの意味を教えて...
-
Verilog_HDLでのdefineとifdef
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
同じEXE・同じファイルで解析結...
おすすめ情報