可能的复制品: 宏定义确定大端机还是小端机
int main() { int x = 1; char *y = (char*)&x; printf("%c\n",*y+48); }
如果是小端点,它会打印1。如果是 big endian 它会打印0。是这样吗?或者将 char * 设置为 int x 总是指向最小有效位,而不管 endianness 是什么?
我想我知道我在标准上读到过这个,但是找不到。继续找。老年人; 应答标题; 非 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% 的小,因为它可以混合/中间。
!is_big_endian()
相信这可以用同样的方法检查,只需将值从 0x01000000改为即 0x01020304给出:
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将类似于:
x
higher memory -----> +----+----+----+----+ |0x01|0x00|0x00|0x00| +----+----+----+----+ A | &x
因此,(char*)(&x) == 1和 *y+48 == '1'。(48是“0”的 ascii 代码)
(char*)(&x) == 1
*y+48 == '1'
如果是 big endian,它将是:
+----+----+----+----+ |0x00|0x00|0x00|0x01| +----+----+----+----+ A | &x
所以这个是 '0'。
'0'
下面这些就够了。
unsigned int x = 1; printf ("%d", (int) (((char *)&x)[0]));
将 &x设置为 char *将使您能够访问整数的各个字节,并且字节的顺序将取决于系统的字节顺序。
&x
char *