C程序检查little和big endian

C程序检查little和big endian,c,byte,endianness,C,Byte,Endianness,可能重复: 如果是little endian,它将打印1。如果是big-endian,它将打印0。对吗?或者,将char*设置为int x是否总是指向最低有效位,而不管是否为endianness?我想我知道我在标准中读到过这一点;但是找不到它。一直在找。古老的回答标题;不是Q-tex;P: 以下程序将确定: #include <stdio.h> #include <stdint.h> int is_big_endian(void) { union {

可能重复:


如果是little endian,它将打印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;
}
!is_big_endian()
不是100%的小,因为它可以混合/中间

相信可以使用相同的方法检查,仅将值从
0x01000000
更改为,即
0x01020304
给出:

switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE

但不完全确定这一点…

这是一个脚本的大端测试:

#包括
int main(int argc,字符**argv){
易失性uint32_t i=0x01234567;
//返回0表示大端,返回1表示小端。
返回(*(uint8_t*)(&i))==0x67;
}
简言之,是的

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

如果是little endian,内存中的
x
将类似于:

       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x
所以
(char*)(&x)==1
,和
*y+48==1'

如果它是big endian,它将是:

    +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x
因此,这个将是
'0'

下面的操作就可以了

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


&x
设置为
char*
将允许您访问整数的各个字节,并且字节的顺序将取决于系统的尾数。

请参阅,这可能是相关的。@common-请注意,大尾数和小尾数不是唯一的选项,并非所有数据类型都需要相同,一些硬件可以在运行时配置。如果你真的需要检查这个,你可能需要检查更多的东西。如果你有选择的话,考虑在固定宽度数据类型上的按位操作来提取/设置比特。它们是用于userland甚至是内核模块的可移植的Great endianness演示代码:为什么要使用ASCII。使用
'0'
。为什么要打印为字符而不是整数。为什么要以整数开始。你没有忘记在e.c[0]@Nate:1==1,1!=0, !!1或1是相同的。还是我在这里遗漏了什么?嗯不确定。。。这不是我的专长。我看到了一个类似的操作,但它的结尾是==1。所以我不确定。@Nate:是的。可能使用类似于
e={0x01020304}的东西
然后需要
a.c[0]==1
,因为
a.c[0]
将是
1
4
在大与小的对比中。啊,就是这样。y上增加的值48有什么意义?@AbinMathewAbraham 48是“0”的ascii码:)我正在使用带有英特尔处理器的MAC OS。应该是小恩迪安。然而,
1
似乎是一个特例,因为当
1
存储在内存中时,它是用大端的。你能告诉我为什么不能只使用
(char)x==1
?为什么我们必须获取地址,将其转换为
char
指针,然后取消引用?如果使用
(char)x
,这不是隐式完成的吗?@J…S我相信
(char)x
无论是否使用endianness都可以工作。通过“work”,我的意思是它会将值
1
分配给
x
,因此无法通过这种方式检测端点。不需要声明为unsigned int。signed int也可以,因为1是正的,即使为sign保留了一位,对于正数,它将是0。为什么是volatile而不是const?我认为这是一种避免任何不希望的编译器优化的简单方法,并且实际查看ram单元中的数据来确定答案。thx,这里必须抑制优化。
       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x
    +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));