C程序来检查一下比较大的endian

可能重复:
Cmacros定义来确定大端还是小端?

int main() { int x = 1; char *y = (char*)&x; printf("%c\n",*y+48); } 

如果是小端,它将打印1.如果是大端,它将打印0.是否正确? 或者将设置一个char * int x总是指向最不重要的位,而不论是endianness?

总之,是的。

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

如果是小端,内存中的x将是这样的:

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

所以(char*)(*x) == 1*y+48 == '1'

如果是大端,那将是:

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

所以这一个将是'0'

以下将做。

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

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

这是一个configuration脚本的大端testing:

 #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 ec[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%,因为它可以混合/中间。

相信这可以使用相同的方法检查只有从0x010203040x01020304更改值给予:

 switch(ec[0]) { case 0x01: BIG case 0x02: MIX default: LITTLE 

但是不完全确定那个…

Interesting Posts