可能重复:
C 宏定义来确定大端或小端机器?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
如果是小端,它将打印 1。如果它是大端,它将打印 0。对吗?还是将 char* 设置为 int x 总是指向最低有效位,而不管字节顺序如何?
可能重复:
C 宏定义来确定大端或小端机器?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
如果是小端,它将打印 1。如果它是大端,它将打印 0。对吗?还是将 char* 设置为 int x 总是指向最低有效位,而不管字节顺序如何?
简而言之,是的。
假设我们在一台 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'
。
以下会做。
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
设置&x
为char *
将使您能够访问整数的各个字节,并且字节的顺序将取决于系统的字节序。
这是来自配置脚本的大端测试:
#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 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
但不完全确定那个...