确定A系统是否使用C使用Big Endian或Little Endian

时间:2011-07-16 18:27:43

标签: c hex endianness

我很好奇这个函数是否会决定字节序。

如果整数someInt存储在little endian中,则测试是一个位掩码,等于1。

在位掩码中,将0x1000转换为与机器的endian样式匹配还是“常量”?

#include <stdio.h>

int isBigEndian(){
    int someInt =0x0001;
    if(someInt & 0x0100 == 1) 
        return 1;
    else 
        return 0;
}

int main(){
    int returnVal = isBigEndian();
    printf("return val is %d", returnVal);
}

5 个答案:

答案 0 :(得分:6)

该函数将始终返回零,因为您的常量也存储在系统的本机字节序中。更好的选择是使用能够回答您问题的系统API。如果你必须是可移植的,你可以比较val == ntohl(val)来决定字节顺序。

答案 1 :(得分:4)

我使用的是:

union {
    short s;
    char b[2];
} endian;

endian.s = 1;
little_endian = endian.b[0] == 1;

答案 2 :(得分:2)

严格地说,唯一完全符合ANSI C的方法是遍历所有可能的int值并检查它们是否与所需的表示匹配。但是,如果您可以假设您将使用的所有系统都是小端,大端或混合端(即,没有像灰色编码或BCD那样真的很奇怪),您可以这样做:

static const unsigned int testvec = 0x01020304;
static const unsigned char letest[4] = { 0x04, 0x03, 0x02, 0x01 };
static const unsigned char betest[4] = { 0x01, 0x02, 0x03, 0x04 };

int isle() {
  return !memcmp(&testvec, letest, 4);
}

int isbe() {
  return !memcmp(&testvec, betest, 4);
}

请注意,如果您不查看字节表示(即,如果您不构建指针以查看原始字节),则无法确定正在使用的字节顺序。 0x0001 & 0x1000在所有C实现上都是0,因为0x00010x1000都是字节交换的(因为0x0001的小端表示是{{ 1}},而不是01 00)。

答案 3 :(得分:1)

最好是将int值转换为sizeof(int)元素的char。看看它看起来是什么样的。

此外,您的代码依赖于非常具体的sizeof(int)。你不应该这样做。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int a = 0xabcdef42;
    unsigned int i;
    char *s = calloc(sizeof(a) + 1, sizeof(s[0]));
    memcpy(s, &a, sizeof(a));
    printf("%x\n", a);
    for (i = 0; i < sizeof(a); i++)
        printf("%x ", (unsigned char)s[i]);
    printf("\n");
    free(s);
    return 0;
}

导致(我的机器有Intel CPU)

abcdef42
42 ef cd ab 

打印字符时,请务必将其转换为无符号,否则您会看到符号扩展名导致的有趣ffffffef值。

答案 4 :(得分:1)

This question有一些非常好的答案(虽然它是在C ++和C99的上下文中);还看看评论,他们非常有见地。

在Linux / Unix或任何使用glibc(mingw / cygwin)的东西上,你也有 endian.h 头文件,其宏随时可用。 您还可以查看boost implementation,这是跨平台的,如果需要的话可以自行实现这些提示。