80

重複の可能性:
ビッグエンディアンまたはリトルエンディアンのマシンを判別するためのCマクロ定義?

int main()
{
  int x = 1;

  char *y = (char*)&x;

  printf("%c\n",*y+48);
}

リトルエンディアンの場合は1を出力します。ビッグエンディアンの場合は0を出力します。それは正しいですか?または、char*をintxに設定すると、エンディアンに関係なく、常に最下位ビットがポイントされますか?

4

4 に答える 4

123

要するに、はい。

32ビットマシンを使用しているとします。

リトルエンディアンの場合x、メモリ内は次のようになります。

       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x

だから、、(char*)(&x) == 1そして*y+48 == '1'。(48は「0」のASCIIコードです)

ビッグエンディアンの場合、次のようになります。

    +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x

だからこれはになります'0'

于 2012-10-09T03:05:42.163 に答える
27

以下が行います。

unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));

に設定&xするchar *と、整数の個々のバイトにアクセスできるようになり、バイトの順序はシステムのエンディアンに依存します。

于 2012-10-09T03:24:06.457 に答える
20

これは構成スクリプトからのビッグ エンディアン テストです。

#include <inttypes.h>
int main(int argc, char ** argv){
    volatile uint32_t i=0x01234567;
    // return 0 for big endian, 1 for little endian.
    return (*((uint8_t*)(&i))) == 0x67;
}
于 2012-10-09T02:26:37.040 に答える
13

私はそれについて標準で読んだことを知っていたと思いました。しかし見つからない。探し続けます。年; 見出しに答える; Q-tex ではない ;P:


次のプログラムは、次のことを決定します。

#include <stdio.h>
#include <stdint.h>

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } e = { 0x01000000 };

    return e.c[0];
}

int main(void)
{
    printf("System is %s-endian.\n",
        is_big_endian() ? "big" : "little");

    return 0;
}

このアプローチもあります。Quake II より:

byte    swaptest[2] = {1,0};
if ( *(short *)swaptest == 1) {
    bigendien = false;

そして!is_big_endian()、100% 混合/中間として少量であるというわけではありません。

0x01000000これは、値を からに変更するだけの同じアプローチを使用してチェックできると信じています0x01020304

switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE

しかし、それについては完全にはわかりません...

于 2012-10-09T02:23:15.853 に答える