5
#include<stdio.h>

int main (void)
{
  int i=257;
  int *ptr=&i;

  printf("%d%d",*((char*)ptr),*((char*)ptr+1));
  return 0;
}

上記のコード実装の出力は定義され、出力はリトルエンディアンとビッグエンディアンのマシン間で異なりますか?

4

3 に答える 3

8

はい。実行時にエンディアンを検出する一般的な方法は、次のとおりです。

uint32_t var = 1;
uint8_t *ptr = (uint8_t*)&var;

if(*ptr) puts("Little Endian");
else puts("Big Endian");

257 => 0x0101であっても、intは32ビットである可能性が高く、その場合、BEマシンでは00を出力し、LEでは11を出力します。

于 2012-09-12T04:55:52.553 に答える
3

はい、そうなります。演算子の優先順位がわからないため、常にこのように記述します。

*(((char*)ptr)+1)

そして、あなたが望むものを達成するために、フォーマット文字列であなた%dをに変更してください。%c

于 2012-09-12T04:56:18.123 に答える
2

はい、実装で定義された動作になります。

キャストptr(char *)て最初のメモリ位置にアクセスすると、メモリに格納されている最初のバイトがアクセスされます。これは、システムがビッグエンディアンシステムであるかリトルエンディアンシステムであるかによって異なります。

関数を呼び出す前にprintf、引数が評価されます。そして、上記のようなこの評価は、システムごとに異なる値を取得します。したがって、実装定義です。

于 2012-09-12T05:00:17.547 に答える