我想我知道我在标准上读到过这个,但是找不到。继续找。老年人; 应答标题; 非 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;
}

你也有 这种方法; 来自地震二:

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

但我不是很确定。

这是来自 配置脚本的 big endian 测试:

#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;
}

简而言之,是的。

假设我们在一台32位机器上。

如果它是 little endian,内存中的 x将类似于:

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

因此,(char*)(&x) == 1*y+48 == '1'。(48是“0”的 ascii 代码)

如果是 big endian,它将是:

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

所以这个是 '0'

下面这些就够了。

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

&x设置为 char *将使您能够访问整数的各个字节,并且字节的顺序将取决于系统的字节顺序。