我很好奇这个函数是否会决定字节序。
如果整数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);
}
答案 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
,因为0x0001
和0x1000
都是字节交换的(因为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,这是跨平台的,如果需要的话可以自行实现这些提示。