可能性のある複製:
ビッグエンディアンまたはリトルエンディアンマシンを決定するCマクロ定義?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
リトルエンディアンの場合は1を出力します。ビッグエンディアンの場合は0を出力します。それは正しいですか?または、char *をint xに設定すると、エンディアンに関係なく常に最下位ビットを指しますか?
要するに、はい。
32ビットマシン上にいるとします。
リトルエンディアンの場合、メモリ内のx
は次のようになります。
higher memory
----->
+----+----+----+----+
|0x01|0x00|0x00|0x00|
+----+----+----+----+
A
|
&x
(char*)(&x) == 1
、および*y+48 == '1'
です。
ビッグエンディアンの場合、次のようになります。
+----+----+----+----+
|0x00|0x00|0x00|0x01|
+----+----+----+----+
A
|
&x
これは'0'
になります。
次のようにします。
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
&x
をchar *
に設定すると、整数の個々のバイトにアクセスできるようになり、バイトの順序はシステムのエンディアンに依存します。
これは configure スクリプトのビッグエンディアンテストです。
#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;
}
私は標準でそれについて読んだことを知っていたと思った。しかしそれを見つけることができません。見続けます。古い;見出しに答える; 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
しかし、それについては完全にはわかりません...