80

可能重复:
C 宏定义来确定大端或小端机器?

int main()
{
  int x = 1;

  char *y = (char*)&x;

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

如果是小端,它将打印 1。如果它是大端,它将打印 0。对吗?还是将 char* 设置为 int x 总是指向最低有效位,而不管字节顺序如何?

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]));

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

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

你也有这种方法;来自地震 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 回答