int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
リトルエンディアンの場合は1を出力します。ビッグエンディアンの場合は0を出力します。それは正しいですか?または、char*をintxに設定すると、エンディアンに関係なく、常に最下位ビットがポイントされますか?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
リトルエンディアンの場合は1を出力します。ビッグエンディアンの場合は0を出力します。それは正しいですか?または、char*をintxに設定すると、エンディアンに関係なく、常に最下位ビットがポイントされますか?
要するに、はい。
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'
。
以下が行います。
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
に設定&x
するchar *
と、整数の個々のバイトにアクセスできるようになり、バイトの順序はシステムのエンディアンに依存します。
これは構成スクリプトからのビッグ エンディアン テストです。
#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
しかし、それについては完全にはわかりません...