質問

私はこれを試してみました

char c[4];
int i=89;
memcpy(&c[0],&i,4);
cout<<(int)c[0]<<endl;
cout<<(int)c[1]<<endl;
cout<<(int)c[2]<<endl;
cout<<(int)c[3]<<endl;

出力は次のようになります:
89
0
0
0

どれが私の嵐を訓練しますか?c[3]にあるはずだと思いました...

役に立ちましたか?

解決

あなたが実行しているプロセッサは、リトルエンディアンのだからです。バイト順序は、マルチバイトの基本的なタイプで、スワップされます。あなたが期待するようビッグエンディアンのマシンでは、それは次のようになります。

他のヒント

これは、プログラムを実行しているためです。 リトルエンディアン CPU。エンディアンネスも参照 ここ そして そこには.

エンディアンネスは明らかゴズとしての答えは指摘しているされます。

しかし、それが何を意味するのか不明である人のために、それは一例に表示されたバイトの順序は、元のint型で順序と同じであることを理解することも重要です。 memcpyのは、プラットフォームのedian種類に関係なく、バイト順序を変更しません。

バイトの順序は、任意の設計上の決定ですので。一度レジスタに、何のバイトオーダーがない 1

私たちはバイトのような小さな単位に対処するとき、

バイト順序が生じます。これは、CPUのデザイナーが作ることを得る、本質的に任意の決断です:ビッグエンディアンかリトルエンディアン

これは、状況を簡素化し、それは主にバイト注文される周辺機器との接続であることを認識することが便利です。はい、それはあなたが証明しているよう取り組むバイトを経由して発見することができますが、一般的なスカラー値にロードされ、レジスタに、ユニットとして格納され、何も変わりません。この場合、バイトオーダーインチ最上位ビットは、少なくとも、「左」に、我々は通常、数字を書く方法です。そして、それは言語標準に従って使用する場合<<>>事業者が常にリトルエンディアンのマシン対ビッグエンディアンで正確に同じ結果を生成する理由です。

しかし、周辺機器へのデータストリームを読み書きするためには、あなたはバイト順を選択することを余儀なくされています。周辺機器は基本的にバイトストリームデバイスであるためです。最下位アドレスは、最上位ビットまたは少なくともを持っていますか?これは、両方の方法とかなり均等に分割することに使用されるキャンプを行っています。

メモリ自体はバイトアドレス指定されているので、

は、それが周辺なく、異なる振る舞いを導出することは確かに可能ですが、あなたがやったように、これは通常、内部の意図的なかいま見せずに発生しません。

、何のバイトを持っていないCPUを想像のみ32ビット・ワード、CコンパイラはCHAR、INT、および長い全32ビット・オブジェクトを作る0、1、2のように対処。 (これはCX9によって許可されません。)うわー、何のバイトオーダーの問題が!これは、両方のです!しかし...私たちは私たちの最初の周辺??フックアップするとき何が起こるか。

<時間>

1. <サブ>まあ、x86のは、小さなレジスタの別名のレジスタを持っていますが、それはまた別の話だ。

別のマシンには、異なるバイト順序を持っていますが、このコードを見て、何が起こるかを考える、バイトが出laied方法に応じてすることができます:

long x = 89;
short *p = (short*)&x;
short y = *p;
あなたのアプリケーションがポータブルまたはチーム内で開発したい場合、あなたはおそらく、それはバグをキャッチし、開発を延長するのは難しいしまうと、このロジックに従うことをしたくない

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top